MYSQL网页编程之Oracle数据库罕见成绩答疑
通过支付一定费用,客户可以得到优先的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为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: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中,大多数关系型数据库所要求的功能已经都具备。 如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。 原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜! having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。 然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。 一个是把SQL语句写到客户端,可以使用DataSet进行加工; 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
页:
[1]