|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
通过支付一定费用,客户可以得到优先的24/7支持,访问内容丰富的在线知识库和联系一个专门的技术负责经理。oracle|数据|数据库|成绩Oracle数据库以其壮大的功效和不乱性而著称,但同时,在开辟和办理方面也存在良多坚苦,笔者在此总结了一些Oracle数据库开辟和办理的罕见成绩,但愿能对人人有所匡助。
问:假如发明表中有坏块,怎样检索别的未坏的数据?
答:起首必要找到坏块的ID(能够运转dbverify完成),假定为1234。运转上面的查询查找段名:
selectsegment_name,segment_type,block_id,blocks
fromdba_extents
where(1234betweenblock_idand(block_id+blocks-1));
一旦找到坏段称号,若段是一个表,则最好创建一个一时表,寄存好的数据。若段是索引,则删除它,再重修。
createtablegood_table
as
selectfrombad_tablewhererowidnotin
(select/+index(bad_table,any_index)/rowid
frombad_tablewheresubstr(rowid,1,8)=1234)
问:如叨教怎样封闭FORM挪用REPORT时的小窗口?
答:在使用Oracle数据库的Develop2000计划开辟界面的过程当中,当FORM挪用REPORT时,会显现一个背景窗口REPORTBACKGROUDENGINE,守候FORM对REPORT的挪用,当FORM挪用别的REPORT时,也利用这个背景服务器,不管挪用几个REPORT,这个背景服务器存在且只要一个。但当FORM与REPORT全体加入后,该窗口仍处于守候形态,不会封闭,这时候,我们必要手工将其封闭。
我们可使用以下参数在FORM挪用REPORT时不显现这个小窗口:
Add_Parameter(pl_id,ORACLE_SHUTDOWN,TEXT_Parameter,Yes);
必要注重的是,该参数必需加在一切参数的后面,即它必需为第一个参数。
问:叨教怎样依据查询前提在REPORT中静态显现纪录?
答:1.在REPORT的“数据模子”上面的“用户参数”中,创立用户自界说参数W_CLAUSE,W_CLAUSE为从FORM传送过去的查询前提,数据范例为字符型,缺省值为NULL。
2.修正查询Q_1,将SQL查询语句修正为selectfromdept&&w_clause。
3.在运转报表时,报表会主动将切合&&w_clause的查询前提纪录显现出来。
假如从FORM传送过去的w_clause为wheredept=1,本报表的SQL查询主动转换为selectfromdeptwheredept=1,并在报表运转了局中显现切合该查询前提的纪录,假如从FORM传送过去的w_cluase为whereto_char(年度,YYYY.MM)=2000.03,则在报表运转了局中主动显现2000年3月份的纪录。
问:在Oracle中,我们怎样检察某表上的束缚?
答:我们可使用上面语句从all_constraints视图中检察某表上的束缚:
SELECTconstraint_name,table_name,r_owner,r_constraint_name
FROMall_constraints
WHEREtable_name=table_nameandowner=owner_name;
另外一个视图ALL_CONS_COLUMNS也包含构成表上束缚列的信息。
问:怎样将数据库从noarchivelog体例改动为archivelog体例?
答:起首翻开Init.ora文件,确保留档日记方针指向一无效目次。
然后启动ServerManager
svrmgrl〉shutdownimmediate
svrmgrl〉startupmount
svrmgrl〉alterdatabasearchivelog;
svrmgrl〉alterdatabaseopen;
svrmgrl〉archiveloglist;
在init.ora中设置参数archive_log_start=TRUE,它设置存档日记为主动启动。在Oracle8i中撑持多个存档日记的方针,因而参数修正为log_archive_dest[n],个中n为1到5。
问:在Oracle数据库中,我们怎样增添表空间的巨细?
答:在开辟Oracle数据库中,我们有两种办法增添表空间的巨细:
1.增添分外的数据文件到表空间中
比方:altertablespaceusersadddatafile/u01/oradata/orcl/users02.dbfsize25m;
2.修正表空间以后的数据文件
比方:alterdatabasedatafile
/u01/oradata/orcl/users01.dbfresize50M;
问:叨教怎样在REPORT中设置静态显现域?
答:在REPORT中设置静态显现域的办法以下:
1.在REPORT的“数据模子”上面的“用户参数”中,创立用户自界说参数,如RQ,RQ是从FORM传送过去的显现日期,数据范例为字符型。
2.在结构模子中,创立一个显现域F_1,在属性选项板中修正该显现域的源为用户自界说参数RQ,而且设为“不成见的”。
3.在静态预览中,创立一个文本域D_1,调剂该文本域的地位和宽度,在该域的内容中输出&&F_1,则该域会静态显现用户界说参数RQ的值。
问:有关隘令
我在Solaris体系上运转Oracle8i8.1.7企业版。我创立了两个数据库:SUGAR和TestDb。将二者的remote_login_passwordfile都设置为“独有(exclusive)”。我试图以SYSDBA身份毗连到TestDb,但未能乐成。上面是我的做法:
$sqlplus/nolog
SQL>connsys/change_on_install@testdb
Connected.(已毗连)
SQL>select*fromv$pwfile_users;
usernamesysdbsysop
-----------------------------------------
internaltruetrue
systruetrue
SQL>connsys/change_on_install@testdbas
sysdba
ERROR(毛病)
ORA-01017:invalidusername/password;logon
denied(有效的用户名/口令,登录被回绝)
Warning:Youareonlongerconnectedto
ORACLE(告诫:你已与ORACLE断开毗连)
我为何不克不及以SYSDBA身份毗连到TestDb?
答:一般Oracle中的SYS口令与INTERNAL口令是同步的,SYS口令存储于口令文件中。在上述情形下你创建了包括有一个口令的口令文件,而不是利用缺省的“change_on_install,”这就是成绩之地点。
但愿上面的办法对你有所匡助。起首,创建一个口令文件,个中包括一个口令,这个口令不要与体系口令婚配:
$orapwdfile=orapwpassword=foobar
entries=40
然后,进进服务器,启动数据库:
$svrmgr
SVRMGR>connectinternal
Connected.(已毗连)
SVRMGR>startup
ORACLEinstancestarted.(ORACLE实例已启动)
TotalSystemGlobalArea(体系全局地区巨细)
193073136bytes
FixedSize(流动巨细)
69616bytes
VariableSize(可变巨细)
141639680bytes
DatabaseBuffers(数据库缓冲区)
45056000bytes
RedoBuffers(重做缓冲区)
6307840bytes
Databasemounted.(数据库已加载)
Databaseopened.数据库已翻开。
如今利用SYS用户的口令,以SYS身份毗连:
SVRMGR>connectsys/change_on_install@ora81
Connected.(已毗连)
乐成了。如今试着以SYSDBA身份毗连:
SVRMGR>connectsys/change_on_install@ora81
assysdba;
ORA-01017:invalidusername/password;logon
denied(有效的用户名/口令;登录被回绝)
这里呈现了你所说的毛病。你的SYS口令为:change_on_install,但口令文件中的口令倒是foobar。SYS用户是公用的,以SYSDBA身份毗连就像是以INTERNAL毗连,你必需利用口令文件中的口令。尝尝如许做:
SVRMGR—connectsys/foobar@ora81assysdba;
Connected.(已毗连)
并非每一个人都必要利用口令文件中的口令;用户必要利用他们本人的口令。经由过程受权SYSDBA给SCOTT,你就能够分明这一点:
SVRMGR>grantsysdbatoscott;
Statementprocessed.(已处置)
这个命令将SCOTT以SCOTT的凭据到场到口令文件中。假如你改动了SCOTT的口令,口令文件也会主动同步改动。如今,你能够尝尝以SYSDBA身份毗连SCOTT了:
SVRMGR>connectscott/tiger@ora81assysdba;
Connected.(已毗连)
统统一般。如今可使用ALTERUSER命令来改动SYS用户的口令。
SVRMGR>alterusersysidentifiedby
change_on_install;
Statementprocessed.(已乐成变动)
SVRMGR≫connectsys/change_on_install@ora81
assysdba;
Connected.(已毗连)
你还能够用change_on_install,由于改动SYS用户口令将同时改动口令文件中的口令。当你创建了口令文件后,Oracle数据库在个中放进两个账号:SYS和INTERNAL,并将你在命令行中供应的口令作为这两个账户的口令。当你改动数据库中的SYS用户口令时,数据库将冲失落口令文件中的SYS和INTERNAL口令。上面操纵将显现口令foobar已是有效的了:
SVRMGR>connectsys/foobar@ora81assysdba;
ORA-01017:invalidusername/password;logon
denied(有效的用户名/口令,登录被回绝)
问:使用QUERY选项输入数据
我晓得在Oracle8i中,可使用QUERY有选择地输入表数据。我想用EXP命令来完成,但没有乐成。上面是我所写的命令,和失掉的毛病信息:
expddd/dddfile=/dbf/u11/customer.dmp
tables=AASC.AST_CUSTOMER_KEEP
query=whereCUA_TRANS_DTS<
add_months(sysdate,-6)
table_export[2]:CUA_TRANS_DTS:notfound.(没有找到)
答:操纵体系分歧,用来指定QUERY=参数的办法也分歧。WHERE语句内里常常有良多特别的字符,如=.>.<和空格等等。而UNIX和Windows操纵体系中的外壳命令提醒是不接待这些字符的,这些字符将被疏忽。你应当依据分歧的操纵体系接纳不必的办法。我一样平常利用带有QUERY选项的参数文件(PARFILE),使用PARFILE,能够不思索操纵体系平台而利用完整不异的办法。
上面给出一个例子。我用select*fromall_objects创建了一个表T,我但愿输入一切object_id小于5000的行。在Windows中,必需如许做:
C:exp>expuserid=tkyte/tkytetables=t
query="""whereobject_id<5000"""
注重:在windows中,必要在WHERE语句的两头利用三个双引号。在UNIX中,必需如许做:
$expuserid=/tables=tquery="where
object_id<5000"
expuserid=/tables=tparfile=exp.par
假如利用包括query="whereobject_id<5000"的PARFILE文件,我能够在两个体系中利用不异的一个命令:
expuserid=/tables=tparfile=exp.par
在两种操纵体系中,完整不异。这相对在分歧的平台中利用分歧的QUERY字符串简单多了。
问:DBMS_RANDOM
您可否告知我写一个能发生年夜于0小于1的随机数的随机数发生器的最好办法?
答:Oracle88.0版先容了DBMS_RANDOM包,Oracle8i8.1.6版先容了DBMS_RANDOM包的新功效,但Oracle8i文档中没有具体周全先容其功效。侥幸的是:有一个新的DBMS_RANDOM包函数可以前往0-1之间的随机数。这个新函数是:
FUNCTIONvalueRETURNNUMBER;
FUNCTIONvalue(lowINNUMBER,highIN
NUMBER)RETURNNUMBER;
FUNCTIONnormalRETURNNUMBER;
FUNCTIONstring(optchar,lenNUMBER)
RETURNVARCHAR2;
VALUE函数的第一种情势前往一个年夜于或即是0且小于1的随机数;第二种情势前往一个年夜于或即是LOW,小于HIGH的随机数。上面是其用法的一个示例:
SQL>selectdbms_random.value,
dbms_random.value(55,100)
2fromdual;
VALUEDBMS_RANDOM.VALUE(55,100)
--------------------------------------------
.78282193679.6367038
NORMAL函数前往从命正态散布的一组数。此正态散布尺度偏向为1,希冀值为0。这个函数前往的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。现实上,这就是你在清单1中所看到的。
最初,是STRING函数。它前往一个长度达60个字符的随机字符串。参数OPT能够是清单2显现的值中的任何一个单个字符。
关于这些函数及DBMS_RANDOM包的文件都包括在SQLPlus中:
selecttext
fromall_source
wherename=DBMS_RANDOM
andtype=PACKAGEorderbyline;
问:毗连序次与谓词求值
鄙人面的查询中,WHERE语句的哪一部分先实行?
Selectfieldnamesfromemp,dept
whereemp.dept_num=dept.numand
emp.nameLikeS%anddept.name=IT;
答:实行序次随已有的索引、统计、和session/init.ora参数的分歧而变更。
假定已有一个创建在DEPT(name)和EMP(dept_num)上的索引。假定优化器以为DEPT是独一的,它大概按上面的按次举行操纵:
使用创建在DEPT(name)上的索引查找dept列
使用创建在EMP(dept_num)上的索引查找婚配的emp列(即毗连emp.dept_num=dept.num)
根据创建在emp.enamelikeS%举行过滤
如今,我们假定没有创建在EMP(dept_num)上的索引,也没有创建在DEPT(name)上的索引,而存在创建在EMP(name)和DEPT(num)上的索引。优化器大概按上面的序次举行操纵:
使用创建在EMP(name)上的索引找到带有S的EMPS
使用创建在DEPT(num)上的索引找到婚配项
依据dept.name=IT过滤了局
谓词求值的序次是不断定的,能够随工夫的改动而改动,并由优化器决意。不要假定任何事变会按必定的序次产生。假如你那末做,跟着工夫的推移,你的使用程序大概会呈现一些看起来十分奇异的毛病。看以下的例子:创建一个表,输出一些数据。当X=a’时,第二列的数据“Y”是一个数值,当X=b’时,“Y”不是数字。
SQL>createtablet(xvarchar2(1),yvarchar2(1));
Tablecreated.
SQL>insertintotvalues(a,1);
1rowcreated.
SQL>insertintotvalues(b,x);
1rowcreated.
如今依据这个表运转一个查询:查找满意x=a,y=1的行。
SQL>select*fromtwherex=aand
y=1;
ERROR:
ORA-01722:invalidnumber
norowsselected(毛病,有效的数字,没有选择任何行)
呦,没有乐成。在这类情形下,数据库起首实行Y=1,当找到Y=X的行后,很明显,它不克不及将X转换为一个数字,以是失利了。而上面的程序将给出分歧的了局:
SQL>analyzetabletcomputestatistics;
Tableanalyzed.(表已剖析过)
SQL>select*fromtwherex=aand
y=1;
XY
--
a1
利用分歧的优化器形式,乐成了!为何?优化器说:“嘿,反省x=a要比反省y=1来得快,由于在y=1中有一个将y从字符变成数字的转换。以是,我先反省x=a,然后再反省y=1。”
这个例子申明谓词实行的序次多是不断定的,你不克不及期望有一种特定的实行序次。也就是说,当你依托一个隐含的转换时,必需十分审慎。
问:显现SGA--fixedsize(流动巨细)与variablesize(可变巨细)
当在svrmgr提醒符下运转“showSGA”时,fixedsize和variablesize是甚么意义?
答:fixedsize就是SGA中流动组件(它在编译oracle数据库自己时就流动于个中)的巨细。它是流动巨细的内存,用来指向SGA的别的部分。SGA这一部分的巨细是不克不及改动的。
variablesize指分派的内存块巨细可变。SGA的可变块,分为共享池、年夜池、JAVA池、游标区和其他布局。有的时候,一些缺失的功能可以通过别的办法来实现,例如,在MySQL4.1以前,你可以通过使用join方法来替代子查询的功能。在MySQL5.0中,大多数关系型数据库所要求的功能已经都具备。 |
|