??xml version="1.0" encoding="utf-8" standalone="yes"?>成人免费在线视频网,国产婷婷一区二区,久久精品中文字幕一区http://www.aygfsteel.com/killme2008/archive/2007/03/20/104895.htmldennisdennisTue, 20 Mar 2007 02:40:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/03/20/104895.htmlhttp://www.aygfsteel.com/killme2008/comments/104895.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/03/20/104895.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/104895.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/104895.html

表结构:(x)

create table  MAIN_NODE (

MLA_ID               INTEGER     not null        ,   //节点ID

MLA_ROOTID          INTEGER,                      //根节?font>ID

MLA_PARENTID        INTEGER,                      //父节?font>ID

MLA_NAME            VARCHAR2(50),                //节点名称

constraint P_mlaid primary key (MLA_ID) );

MLA_ID   MLA_PARENTID  MLA_ROOTID   MLA_NAME

1           0                   0             父节?font>1     

2           1                   0            Q父节点1?font>/Q子节点1   

3            2                   0            Q父节点1?font>/子节?font>1?font>/Q孙子节?font>1

4           0                   0             父节?font>2     

5           4                   0            Q父节点2?font>/Q子节点1   

?wi)结构直观图Q?/font>

根节点(0Q?br />     父节?font>1Q?font>1Q?br />           Q父节点1?font>/Q子节点1Q?font>2Q?font> 
                     Q父节点1?font>/子节?font>1?font>/Q孙子节?font>1Q?font>3Q?br />     父节?font>2Q?font>4Q?br />           Q父节点2?font>/Q子节点1Q?font>5Q?/font>

语句要求的功能:(x)实现l出一个父节点id然后得到该父节点下的所有子节点的信?/font>Db2 的查询语句:(x)

WITH  RPL (mla_parentid, mla_id, mla_name) AS

(

SELECT ROOT.mla_parentid, ROOT.mla_id, ROOT.mla_name FROM main_node ROOT WHERE ROOT.mla_id = ?

UNION  ALL

SELECT CHILD.mla_parentid, CHILD.mla_id, CHILD.mla_name FROM RPL PARENT, main_node CHILD WHERE PARENT.mla_parentid = CHILD.mla_id

 )

SELECT DISTINCT mla_parentid, mla_id, mla_name FROM RPL ORDER BY mla_parentid, mla_id, mla_name

让我们研I这个查询语句:(x)
  • RPL 作ؓ(f)一个具有以下三列的虚拟表:(x)mla_parentid, mla_id ?mla_name?
  • WITH 子句内的W一?SELECT 语句是初始化表。它只执行一ơ。它的结果Ş成虚拟表的初始内容以作ؓ(f)递归的种子。在上面的示例中Q种子是 mla_id ?L传进ȝ参数 的一行或多行?
  • W? 二个 SELECT 语句执行多次。将U子作ؓ(f)输入QJOIN 中的辅助表)(j)传递给W二?SELECT 语句以生下一个行集合。将 JOIN 的结果添加(UNION ALLQ到虚拟表的当前内容中,q放回到其中以Ş成用于下一ơ传递的输入。只要有行生,q个q程׃(x)l箋?
  • 如果期望Q虚拟表上最后的 SELECT 允许我们选择递归查询所产生的所有行或仅部分行?br />

Oracle的查询语句:(x)

   select mla_parentid, mla_id, mla_name from main_node

start with mla_id=? connect by prior mla_id=mla_parentid

让我们研I这个查询语句:(x)
  •   本语句实际上?start with ...connect by 的用法, start with 后面所跟的是是递归的种子。在上面的示例中Q种子是 mla_id ?L传进ȝ参数
  • connect by 后面?prior"如果~省Q则只能查询到符合条件的起始行,q不q行递归查询Q?br />
  • connect by prior 后面所攄字段是有关系的,它指明了查询的方向。如果后面放的是 mla_id=mla_parentid 则表明从本节Ҏ(gu)向叶子节点;如果后面攄?font> mla_parentid = mla_id则表明从根节Ҏ(gu)向本节点Q?/li>


dennis 2007-03-20 10:40 发表评论
]]>
oracle table-lock?U模?/title><link>http://www.aygfsteel.com/killme2008/archive/2007/03/05/101911.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 05 Mar 2007 06:34:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2007/03/05/101911.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/101911.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2007/03/05/101911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/101911.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/101911.html</trackback:ping><description><![CDATA[Oracle中的锁定可以分ؓ(f)几类QDML lockQdata lockQ,DDL lockQdictionary lock)和internal lock/latch?br />DML lock又可以分为row lock和table lock。row lock在select.. for update/insert/update/delete旉式自动生,而table lock除了隐式产生Q也可以调用lock table <table_name> in </table_name>name来显C锁定?<p>如果不希望别的session lock/insert/update/delete表中L一行,只允许查询,可以用lock table table_name in exclusive mode?X)q个锁定模式U别最高,q发度最?br /><br />如果允许别的session查询或用select for update锁定记录Q不允许insert/update/deleteQ可以用lock table table_name in share row exclusive mode?SRX)<br /><br />? 果允许别的session查询或select for update以及(qing)lock table table_name in share modeQ只是不允许insert/update/deleteQ可以用lock table table_name in share mode?share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。进入share row exclusive mode后其他session不能L你insert/update/deleteQ而进入share mode后其他session也同样可以进入share modeQ进而阻止你对表的修攏V?S)<br /><br />q有两种锁定模式Qrow share(RS)和row exclusive(RX)。他们允许的q发操作更多Q一般直接用DML语句自动获得Q而不用lock语句?/p> 详细参考concepts文档中的"Type Of Locks"Q?a >http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96524/c21cnsis.htm#2937</a><img src ="http://www.aygfsteel.com/killme2008/aggbug/101911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2007-03-05 14:34 <a href="http://www.aygfsteel.com/killme2008/archive/2007/03/05/101911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>d卸蝲oraclehttp://www.aygfsteel.com/killme2008/archive/2007/03/02/101491.htmldennisdennisFri, 02 Mar 2007 08:11:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/03/02/101491.htmlhttp://www.aygfsteel.com/killme2008/comments/101491.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/03/02/101491.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/101491.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/101491.html
  1. 关闭所有oracle的服务和E序
  2. 选择开始| E序|oracle Installation Products命o(h)Q运行Universal InstallerQ弹出欢q对话框
  3. 单机 卸蝲产品 按钮Q弹出Inventory对话?/li>
  4. 选中Inventroy对话框中的所有节点,点击删除Q确认即?/li>
  5. ? ?开始|q行 输入regeditq按ENTER键,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLEQ删除此象,然后选择 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ServicesQ滚动此列表Q删除与oracle有关的所 有选项?/li>
  6. 从桌面上、STARTUP和程序菜单中删除所有ORACLE的组和图标?/li>
  7. 重启pȝ?/li>
  8. 删除包括文g在内的安装目录。至此ORACLE的全部卸载完成?/li>


dennis 2007-03-02 16:11 发表评论
]]>
oracle sql语句优化Q{载)(j)http://www.aygfsteel.com/killme2008/archive/2007/03/02/101434.htmldennisdennisFri, 02 Mar 2007 03:57:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/03/02/101434.htmlhttp://www.aygfsteel.com/killme2008/comments/101434.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/03/02/101434.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/101434.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/101434.html阅读全文

dennis 2007-03-02 11:57 发表评论
]]>
Oracle数据库的ORA-00257故障解决q程(转蝲Q?/title><link>http://www.aygfsteel.com/killme2008/archive/2007/03/02/101407.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 02 Mar 2007 03:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/killme2008/archive/2007/03/02/101407.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/101407.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2007/03/02/101407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/101407.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/101407.html</trackback:ping><description><![CDATA[在导入一?G的备份文件时Q数据库报ORA-00257故障Q找到这文章。{自http://dev.yesky.com/438/2525938.shtml<br /><br /><b>概述</b>Q?br /><br />  Oracle数据库是目前业界最常用的大型数据库pȝQ我在实际项目中遇到出现ORA-00257错误Q空间不错误)(j)Q通过查找资料Q绝大部分说q是׃归档日志太多Q占用了全部?a class="bluekey" target="_blank">盘</a>剩余I间D的,通过单删除日志或加大存储I间p够解冟뀂但是我在Oracle 10g上发玎ͼ存储I间q有很大Q却也报q个错误。原来是Oracle 10g中新的特性,对Flash Recovery的管理导致的?<br /><br />  <b>1、Yg环境</b><br /><br />  <a class="bluekey" target="_blank">服务?/a>HP Proliant DL580G4QIntel Xeon 3.16GHz/4GB/ 72.8*4/RAID4)<br /><br />  操作pȝRed Flag DC Server release 5.0 (Trinity) for x86-64 Linux<br /><br />  数据库Oracle 10.2.0.1.0<br /><br />  <b>2、问题现?/b><br /><br />  数据库系l已l试q行了半个多月,??4日晚上连接数据库后做数据更新时出现ORA-00257错误Q如下图?br /><br /><table align="center" width="90%"><tbody><tr><td><div align="center"><img style="border-color: rgb(0, 0, 0);" src="http://dev.yesky.com/imagelist/06/32/04e4v180a835.png" border="1" /></div></td></tr></tbody></table><br />  提示归档错误Q通过查找ORACLE错误代码Q解释ؓ(f)盘I间不Q需要删除归档日志增加空_(d)但是服务器可用空?00GBQ目前只用了10GB左右Q这是ؓ(f)什么呢Q?br /><br />  <b>3、诊断过E?/b>Q?br /><br />  1Q查看ORACLE数据库归档日志情?br /><br /><table align="center" bgcolor="#e7e9e9" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>[root@hrmsdb /]# cd /oracle/flash_recovery_area/HKCHR/archivelog<br /><br />[root@hrmsdb archivelog]# ls<br /><br />2006_07_04 2006_07_13 2006_07_17 2006_07_20 2006_07_23<br /><br />2006_07_11 2006_07_14 2006_07_18 2006_07_21 2006_07_24<br /><br />2006_07_12 2006_07_15 2006_07_19 2006_07_22 2006_07_25<br /><br />[root@hrmsdb archivelog]# cd 2006_07_25<br /><br />[root@hrmsdb 2006_07_25]# ls<br /><br />[root@hrmsdb 2006_07_25]# cd ../2006_07_24<br /><br />[root@hrmsdb 2006_07_24]# ls<br /><br />o1_mf_1_92_2d933vgb_.arc o1_mf_1_96_2d954ns7_.arc o1_mf_1_98_2d969d5h_.arc<br /><br />o1_mf_1_95_2d9537cs_.arc o1_mf_1_97_2d956km0_.arc</td></tr></tbody></table><br />  说明在出现问题之前数据库归档处理一直是正常的?br /><br />  2Q查看数据库REDOLOG情况<br /><br /><table align="center" bgcolor="#e7e9e9" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>[oracle@hrmsdb ~]$ sqlplus /nolog<br /><br />SQL*Plus: Release 10.2.0.1.0 - Production on 星期?7?25 10:44:18 2006<br /><br />Copyright (c) 1982, 2005, Oracle. All rights reserved.<br /><br />SQL> connect / as sysdba<br /><br />已连接?br /><br />SQL> select * from v$log;<br /><br />GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME<br /><br />---------- ---------- ---------- ---------- ---------- --- --------------------------------------- --------------<br /><br />1 1 101 52428800 1 NO CURRENT 3621973 24-7?-06<br /><br />2 1 99 52428800 1 NO INACTIVE 3600145 24-7?-06<br /><br />3 1 100 52428800 1 NO INACTIVE 3611932 24-7?-06</td></tr></tbody></table><br />  发现ARC状态ؓ(f)NOQ表C系l没法自动做归档?br /><br />  3Q手工切换日?br /><br /><table align="center" bgcolor="#e7e9e9" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SQL> alter system switch logfile;<br /><br />alter system switch logfile<br /><br />*<br />W?1 行出现错?</td></tr></tbody></table><br />  ORA-01013: 用户h取消当前的操?br /><br />  在等待长旉没反应后Q中断操作,手工切换日志没有成功?br /><br />  4Q查看Oracle数据库后台归档服务进E?br /><br /><table align="center" bgcolor="#e7e9e9" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>[oracle@hrmsdb ~]$ ps -ef|grep oracle<br /><br />oracle 4601 1 0 Jul11 ? 00:00:04 /oracle/product/10.2.0/db_1/bin/<br /><br />tnslsnr LISTENER -inherit<br /><br />oracle 5025 1 0 Jul11 ? 00:00:00 /usr/bin/ssh-agent -s<br /><br />oracle 20923 1 0 Jul24 ? 00:00:01 ora_pmon_hkchr<br /><br />oracle 20925 1 0 Jul24 ? 00:00:00 ora_psp0_hkchr<br /><br />oracle 20927 1 0 Jul24 ? 00:00:00 ora_mman_hkchr<br /><br />oracle 20929 1 0 Jul24 ? 00:00:01 ora_dbw0_hkchr<br /><br />oracle 20931 1 0 Jul24 ? 00:01:07 ora_lgwr_hkchr<br /><br />oracle 20933 1 0 Jul24 ? 00:00:05 ora_ckpt_hkchr<br /><br />oracle 20935 1 0 Jul24 ? 00:00:01 ora_smon_hkchr<br /><br />oracle 20937 1 0 Jul24 ? 00:00:00 ora_reco_hkchr<br /><br />oracle 20939 1 0 Jul24 ? 00:00:00 ora_cjq0_hkchr<br /><br />oracle 20941 1 0 Jul24 ? 00:00:01 ora_mmon_hkchr<br /><br />oracle 20943 1 0 Jul24 ? 00:00:05 ora_mmnl_hkchr<br /><br />oracle 20945 1 0 Jul24 ? 00:00:00 ora_d000_hkchr<br /><br />oracle 20947 1 0 Jul24 ? 00:00:00 ora_s000_hkchr<br /><br />oracle 20953 1 0 Jul24 ? 00:09:41 ora_arc0_hkchr<br /><br />oracle 20955 1 1 Jul24 ? 00:10:29 ora_arc1_hkchr<br /><br />oracle 20959 1 0 Jul24 ? 00:00:00 ora_qmnc_hkchr<br /><br />oracle 20967 1 0 Jul24 ? 00:00:00 ora_q000_hkchr<br /><br />oracle 20969 1 0 Jul24 ? 00:00:00 ora_q001_hkchr<br /><br />oracle 21715 1 0 Jul24 ? 00:00:19 oraclehkchr (LOCAL=NO)<br /><br />oracle 21765 1 0 Jul24 ? 00:00:00 ora_j000_hkchr<br /><br />oracle 21816 1 0 Jul24 ? 00:00:00 ora_j001_hkchr<br /><br />oracle 21832 1 0 Jul24 ? 00:00:00 ora_j002_hkchr<br /><br />oracle 21839 1 0 Jul24 ? 00:00:00 ora_j003_hkchr<br /><br />oracle 21859 1 0 Jul24 ? 00:00:00 ora_j004_hkchr<br /><br />oracle 21861 1 0 Jul24 ? 00:00:00 ora_j005_hkchr<br /><br />oracle 21886 1 0 Jul24 ? 00:00:00 ora_j006_hkchr<br /><br />oracle 21888 1 0 Jul24 ? 00:00:00 ora_j007_hkchr<br /><br />root 23187 23186 0 10:39 ? 00:00:00 login -- oracle<br /><br />oracle 23188 23187 0 10:39 pts/0 00:00:00 -bash<br /><br />oracle 23216 23188 0 10:39 pts/0 00:00:00 sqlplus<br /><br />oracle 23217 23216 0 10:39 ? 00:00:00 oraclehkchr (DESCRIPTION=(LOCAL=<br /><br />YES)(ADDRESS=(PROTOCOL=beq)))<br /><br />root 23224 23223 0 10:40 ? 00:00:00 login -- oracle<br /><br />oracle 23225 23224 0 10:40 pts/1 00:00:00 -bash<br /><br />oracle 23310 23225 0 10:46 pts/1 00:00:00 ps -ef<br /><br />oracle 23311 23225 0 10:46 pts/1 00:00:00 grep oracle<br /><br />[oracle@hrmsdb ~]$<br /><br />后台q程都正常运行?/td></tr></tbody></table><br />  5Q查看FLASH_RECOVERY_AREAI间使用情况<br /><br /><table align="center" bgcolor="#e7e9e9" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>[root@hrmsdb /]# cd /oracle<br /><br />[root@hrmsdb oracle]# ls<br /><br />admin flash_recovery_area oraInventory product<br /><br />[root@hrmsdb oracle]# du -a -k flash_recovery_area<br /><br />4 flash_recovery_area/HKCHR/onlinelog<br /><br />42456 flash_recovery_area/HKCHR/archivelog/2006_07_15/o1_mf_1_74_2cj1h1jz_.arc<br /><br />……………?<br /><br />42448 flash_recovery_area/HKCHR/archivelog/2006_07_14/o1_mf_1_68_2cfzwwvt_.arc<br /><br />512560 flash_recovery_area/HKCHR/archivelog/2006_07_14<br /><br />1469224 flash_recovery_area/HKCHR/archivelog<br /><br />6988 flash_recovery_area/HKCHR/backupset/2006_07_04/o1_mf_ncsnf_TAG20060704T1<br /><br />74229_2bng1o0b_.bkp<br /><br />876916 flash_recovery_area/HKCHR/backupset/2006_07_04/o1_mf_nnndf_TAG20060704T1<br /><br />74229_2bng0cx4_.bkp<br /><br />883908 flash_recovery_area/HKCHR/backupset/2006_07_04<br /><br />883912 flash_recovery_area/HKCHR/backupset<br /><br />2353144 flash_recovery_area/HKCHR<br /><br />2353148 flash_recovery_area<br /><br />[root@hrmsdb oracle]#<br /><br /><br />FLASH_RECOVERY_AREAI间使用?.35GB</td></tr></tbody></table><br />  6Q查看FLASH_RECOVERY_AREAI间中各部分使用情况<br /><br /><table align="center" bgcolor="#e7e9e9" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SQL> select * from v$recovery_file_dest;<br /><br />NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES<br /><br />------------------------------------------------------------------------------------------------------------------<br /><br />/oracle/flash_recovery_area 2147483648 2134212608 0 35<br /><br />SQL> select * from v$flash_recovery_area_usage;<br /><br />FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES<br /><br />------------ ------------------ ------------------------- ---------------- -------------- -------------- -------------<br /><br />CONTROLFILE 0 0 0<br /><br />ONLINELOG 0 0 0<br /><br />ARCHIVELOG 69.97 0 40<br /><br />BACKUPPIECE 30.01 0 2<br /><br />IMAGECOPY 0 0 0<br /><br />FLASHBACKLOG 0 0 0<br /><br />已选择6行?/td></tr></tbody></table><br />  发现ARCHIVELOG占近70Q,BACKUPPIRCR占了30Q,q样FLASH_RECOVERY_AREAI间的空间已l被完全占据了?br /><b>4、解册E?/b><br /><br />  Ҏ(gu)数据库目前可用存储空间ؓ(f)200GB、FLASH_RECOVERY_AREAI间?GB的实际情况,把FLASH_RECOVERY_AREA的空间修改ؓ(f)20GB?br /><br /><table align="center" bgcolor="#e7e9e9" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=20g;<br /><br />pȝ已更攏V?br /><br />SQL> select * from v$recovery_file_dest;<br /><br />------------------------------------------------------- ---------- -----------------------------------<br /><br />NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES<br /><br />----------- ---------- ----------------- ------------- -------------- ---------- ---------- ------------<br /><br />/oracle/flash_recovery_area 2.1475E+10 2264587776 0 38</td></tr></tbody></table><br />  q时再查看日志的状态,发现REDO LOG处于正常的归档状态?br /><br /><table align="center" bgcolor="#e7e9e9" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>SQL> select * from v$log;<br /><br />GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME <br /><br />---------- ---------- ---------- ---------- ---------- --- -------------------------------------------- --------------<br /><br />1 1 101 52428800 1 YES ACTIVE 3621973 24-7?-06<br /><br />2 1 102 52428800 1 NO CURRENT 3650399 25-7?-06<br /><br />3 1 100 52428800 1 YES INACTIVE 3611932 24-7?-06<br /><br />SQL> select * from v$flash_recovery_area_usage;<br /><br />FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES<br /><br />------------ ------------------ ------------------------- ---------------<br /><br />CONTROLFILE 0 0 0<br /><br />ONLINELOG 0 0 0<br /><br />ARCHIVELOG 7.6 0 43<br /><br />BACKUPPIECE 4.21 0 2<br /><br />IMAGECOPY 0 0 0<br /><br />FLASHBACKLOG 0 0 0<br /><br />已选择6行?br /><br />SQL></td></tr></tbody></table><br />  <strong>5、小l?/strong><br /><br />  造成本次故障的原因由两方面同时发生所造成的:(x)<br /><br />  ·其一是Flash_Recovery_AreaI间~省安装时比较小Q只?GBQ容易用完;<br /><br />  ·其二是由于采用归档方式通过Veritas备䆾Q由于备份Y件没有运行,造成归档日志没有?qing)时删除?br /><br />  从本ơ故障解军_理中Q我们可以得出经验教训:(x)<br /><br />  ·Oracle 10g数据库物理空间管理方式与以前Oracle发生了变化,对归档日志所在的Flash_Recovery_AreaI间q行了另外限Ӟ<br /> <br />  ·Ҏ(gu)据库pȝ理员要对Oracle数据库归档日志、备份Y件运行状况定期检查,提前发现、处理可能发生的故障?br /><img src ="http://www.aygfsteel.com/killme2008/aggbug/101407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2007-03-02 11:09 <a href="http://www.aygfsteel.com/killme2008/archive/2007/03/02/101407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle错误备忘QORA-00354QORA-00353和ORA-00312的处理方法)(j)http://www.aygfsteel.com/killme2008/archive/2007/03/02/101401.htmldennisdennisFri, 02 Mar 2007 02:51:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/03/02/101401.htmlhttp://www.aygfsteel.com/killme2008/comments/101401.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/03/02/101401.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/101401.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/101401.html   
alter database open;
命o(h)Q报错:(x)
ORA-16014: 日志 1 的序列号 680 未归? 没有可用的目的地
ORA
-00312: 联机日志 1 U程 1
alter database clear unarchived logfile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG'

看情冉|日志文g出错Q幸好是试服务器,把我q个对oracle理一H不通的家伙急坏了。马上baidu了下错误代码Q找C文章:(x)

在日志文件损坏或?span lang="EN-US">dumpq些损坏的日志文件的时候,通常回收到类g面的错误Q?span lang="EN-US">

ORA-00354: corrupt redo log block header

ORA-00353: log corruption near block 3740 change 0 time 04/11/2006 13:49:56  

ORA-00312: online log 1 thread 1: '/oracle/oradata/TSMISC02/redo01.log'

或者:(x)

sys@TSMISC02> ALTER SYSTEM DUMP LOGFILE '/oracle/oradata/TSMISC02/redo01.log';

ALTER SYSTEM DUMP LOGFILE '/oracle/oradata/TSMISC02/redo01.log'

*

ERROR at line 1:

ORA-00354: corrupt redo log block header

ORA-00353: log corruption near block 3740 change 6918597 time 04/10/2006 23:53:24

ORA-00334: archived log: '/oracle/oradata/TSMISC02/redo01.log'

Elapsed: 00:00:03.36

sys@TSMISC02>

q里首先介绍一?span lang="EN-US">oracle使用日志文g的策略?/span>每一个数据库臛_有两个或多个日志文gl(redo log groupQ,每个l中臛_有一个日志成员(redo log memberQ。日志文件的主要功能是真实完整的记录Ҏ(gu)据库作的全部修改。在出现故障Ӟ如果不能修Ҏ(gu)据永久地写入数据文gQ则pȝ利用日志前滚来恢复数据库数据文件。日志文件主要是保护数据库以防止故障?/span>

如果LGWR 臛_能够讉K一个组内的某一个成员,那么oracle׃(x)对这个组内的可访问成员l照常进行读写操作,也就是说Q?/span>LGWR 忽略组内的不可用成员。如果在日志切换?/span>LGWR 无法讉K下一个组的所有成员或者损坏的日志文g时改l中日志成员Q数据库的正常操作就无法q行了。这也就?/span>oracle常说的,Z防止日志文g的故障或丢失Q强烈徏议镜象日?/span>(mirrored redo log)Q即Q在不同盘上维护至两个或多个日志文gQ?/span>redo log memberQ副本的作用——只要组内有一个可用的成员Q?/span>oracle׃(x)l箋“正常”操作?/span>

回到q里Q如果数据库发生日志文g的上q损坏,不管是哪U原因造成的,解决Ҏ(gu)无外乎是使用完好的文件恢复已l损坏的文gQ或者初始化损坏的文件组{等Q日志文件的故障处理不做q里的重点介l,我将?x)在其他的文章中逐一说明和D例)(j)?span lang="PT-BR">

我们q里主要是用了_disable_loggingQ?span lang="EN-US">trueq个隐含参数Q实际性能故障诊断Ӟ你可以通过alert.log扑ֈ相关信息Q造成了归档数据库中,所有日志不能归档,最l数据库不能l箋操作的问题,因此解决Ҏ(gu)是Q?span lang="EN-US">

Q?span lang="EN-US">aQ如果是使用了隐含参敎ͼ那么Lq个隐含参数Q?span lang="EN-US">

    alter system set "_disable_logging"=false scope=both;

Q?span lang="EN-US">bQ然后,初始化损坏的redo logQ?span lang="EN-US">

alter database clear unarchived logfile '<logilename>'; 

例如Q?span lang="EN-US">

sys@TSMISC02> alter system set "_disable_logging"=false scope=both;

System altered.

Elapsed: 00:00:00.01

sys@TSMISC02>

sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo02.log'; 

Database altered.

Elapsed: 00:00:00.18

sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo03.log'; 

Database altered.

Elapsed: 00:00:00.17

sys@TSMISC02>

OK,马上执行命o(h)Q?br />
alter database clear unarchived logfile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG'

再打开数据库,一切正常,重新导入Q问题解冟?br />
我需要加Z对oracle基本故障处理斚w知识的学?fn)了?br />


dennis 2007-03-02 10:51 发表评论
]]>
oracle中用SQL递归语句 http://www.aygfsteel.com/killme2008/archive/2007/02/11/99289.htmldennisdennisSun, 11 Feb 2007 12:02:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99289.htmlhttp://www.aygfsteel.com/killme2008/comments/99289.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99289.html#Feedback1http://www.aygfsteel.com/killme2008/comments/commentRss/99289.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/99289.html
oracle中的递归语句Q?
start   with     connect   by   prior  .


例子Q?br />
 pid  id
  a   b  
  a   c    
  a   e  
  b   b1  
  b   b2  
  c   c1  
  e   e1  
  e   e3  
  d   d1  
   
  指定pid=aQ选出  
  a   b  
  a   c    
  a   e  
  b   b1  
  b   b2  
  c   c1  
  e   e1  
  e   e3 
SQL语句Q?br />
  select   parent,child   from   test   start   with   pid='a'   
  connect   
by   prior   id=pid 



dennis 2007-02-11 20:02 发表评论
]]>
oracle中的合ƈ查询 http://www.aygfsteel.com/killme2008/archive/2007/02/11/99287.htmldennisdennisSun, 11 Feb 2007 12:01:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99287.htmlhttp://www.aygfsteel.com/killme2008/comments/99287.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99287.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/99287.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/99287.htmlZ合ƈ多个select语句的查询结?可以使用集合操作WUNION,UNION ALL,INTERSECT和MINUS.语法如下:

 

SELECT语句1  [ UNION | UNION ALL | INTERSECT | MINUS ]  SELECT语句2

 

使用集合操作W有以下一些限?

.对于LOB,VARRAY,嵌套表类来说Q集合操作符无效

.对于LONG?UNION ALL,INTERSECT和MINUS无效

.如果选择列表包含了表辑ּ,必须指定别名

1。UNIONQ用于获取两个结果集的ƈ集,?x)自动去掉结果集中的重复行,q会(x)以第一列的l果q行排序Q例Q?/p>

 

select   *   from  employee  union   select   *   from  employee;

 

2。UNION ALLQ与UNION怼Q不同的是UNION ALL不会(x)自动d重复行,也不?x)以M列排?/p>

 

   select   *   from  employee  union   all   select   *   from  employee;

 

3。INTERSECTQ用于获取两个结果集的交集,q且以第一列排序,如:(x)

 

select   *   from  employee  intersect   select   *   from  employee  where  id = ' 1 ' ;

 

4。MINUSQ用于获取结果集的差集(或者说补集Q,昄W一个结果集存在的,W?个结果集不存在的数据Q?/p>

 

select   *   from  employee minus  select   *   from  employee  where  id = ' 1 ' ;

 

注意事项Q?/p>

1。两个选择列表必须完全一?/p>

2。可以连l用集合操作符Q这些操作符拥有相同优先U,多个操作W存在时Q从左向x行,如:(x)

 

SQL >    select   *   from  employee minus  select   *   from  employee  where  id = ' 1 '   union   select   *   from  employee  where  id = ' 1 ' ;

        ID NAME           SALARY EMAIL
-- -------- ---------- ---------- ------------------------------
          1  love              3100  fasda
         
2  love              4100  killme2008 @gmail


 



dennis 2007-02-11 20:01 发表评论
]]>
PL/SQL学习(fn)W记Q五Q?http://www.aygfsteel.com/killme2008/archive/2007/02/11/99286.htmldennisdennisSun, 11 Feb 2007 11:59:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99286.htmlhttp://www.aygfsteel.com/killme2008/comments/99286.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99286.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/99286.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/99286.html

~写控制l构Q顺序结构,条gl构Q@环结?/p>

一。条件语句:(x)

1。与delphi或者javaQ或者其他Q何语a的条件语句基本一样咯Q?/p>

单条Ӟ(x)

IF condition THEN

  ......

END IF;

双条Ӟ(x)

IF condition THEN

  ......

ELSE

  ...

END IF;

多条Ӟ(x)

IF condition THEN

   ...

ELSEIF conditon THEN

   ....

ELSEIF conditon THEN

   ....

ELSE

   ....

END IF;

 

举例Q?/p>

DECLARE
  v_sal 
NUMBER ( 6 , 2 );
  v_id 
NUMBER ;
BEGIN
  v_id:
= ' &id ' ;
  
SELECT  salary  into  v_sal  FROM  employee
  
WHERE  id = v_id;
  
IF  v_sal < 4000   THEN
     
update  employee  set  salary = (v_sal + 100 where  id = v_id;
  
ELSE
     
update  employee  set  salary = (v_sal - 900 where  id = v_id;
  
END   IF ;
END ;


二。CASE语句Q?/p>

各种语言的switch ...case语句相同Q只不过没有switch关键字?/p>

1。用单一选择W进行比较:(x)

 

CASE  selector

  
WHEN  expression1  THEN  ;

  
WHEN  expression  2   THEN  ;

  

 

END CASE;

2。多U条件比较:(x)

 

CASE

  
WHEN  condition1  THEN  ;

  
WHEN  condition2  THEN  ;

  
WHEN  condition3  THEN  ;

END CASE;
  

 

 

Q三Q@环语句:(x)

3U@环:(x)

1。基本@环,臛_执行一ơ:(x)

LOOP

   statement1;

   ...

   EXIT WHEN 退出@环条?

END LOOP1;

例如Q?/p>

 

LOOP

  
insert   into  employee(id,name)  values (i, ' dennis ' );

  i:
= i + 1 ;

  
EXIT   WHEN  i > 10 ;

END  LOOP;

 

2。while循环Q?/p>

WHILE conditon1 LOOP

   statement1;

   ...

END LOOP;

比如上面的例子改写ؓ(f)Q?/p>

 

WHILE  i <= 10  LOOP

   
insert   into  employee(id,name)  values (i, ' dennis ' ); 

   i:
= i + 1 ;

END  LOOP;

 

3。FOR循环Q类gruby的FOR循环Q?/p>

FOR counter IN [REVERSE] 下限..上限 LOOP

  statement1;

  ...

END LOOP;

REVERSE参数可选,有的话表CZ上限往下限递减?/p>

 

Q四Q顺序控制语?/p>

PL/SQL也提供了GOTO和NULL语句用于控制语句执行序QGOTO语句与JAVA的机制相|通过label来实现蟩转,量不要使用。NULL语句不会(x)执行M操作Q它的存在主要是Z提高E序的可L。?/p>



dennis 2007-02-11 19:59 发表评论
]]>
PL/SQL学习(fn)W记(? http://www.aygfsteel.com/killme2008/archive/2007/02/11/99284.htmldennisdennisSun, 11 Feb 2007 11:57:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99284.htmlhttp://www.aygfsteel.com/killme2008/comments/99284.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99284.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/99284.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/99284.htmlq部分主要讲q在PL/SQL中如何访问oracle

(一)(g)索单行数?/p>

在PL/SQL嵌入select语句,使用Ҏ(gu):

SELECT select_list INTO variable_name1,variable_name2,variable_name3... FROM TABLE WHRE condition

?

 

DECLARE
  v_sal 
NUMBER ( 6 , 2 );
  v_id 
NUMBER ;
BEGIN
  v_id:
= ' &id ' ;
  
SELECT  salary  into  v_sal  FROM  employee
  
WHERE  id = v_id;

  .

 

需要注意事?

1.不仅可以使用普通标量接受数据,也可以用Record接受数据

2.使用的SELECT语句必须q回一条记?q且只能q回一条记?否则?x)触发PL/SQL异常,或者显C错误信?/p>

(1)NO_DATA_FOUND异常,当没有数据返回时抛出此异?/p>

(2)TOO_MANY_ROWS异常,q回多条数据时抛出此异常

(3)在WHERE子句中用变量时必须注意,变量名不能字D名相同,否则?x)触发TOO_MANY_ROWS异常

(?使用DML语句

1.在PL/SQL中用DML语句(insert,update,delete)语句与直接在sqlplus使用没什么不?只不q可以用变量代替具体的?不再举例

2.SQL游标:

Q?Q在执行SELECT,INSERT,UPDATE,DELETE语句?Oracle Server?x)?f)q些SQL语句分配相应的Context Area,q且Oracle使用此Context Area解析q执行相应的SQL语句,而游标就是指向Context Area的指针。在oracle中,游标又分为显式和隐式两种Q其中隐式游标又被成为SQL游标Q专门用于处理SELECT INTOQINSERTQDELETEQUPDATE语句。而显式游标多用于处理多行的SELECT语句?/p>

Q?QSQL游标的四U属性:(x)

(A) SQL%ISOPEN

用于定SQL游标是否打开。因为oracle在执行SELECT INTOQINSERTQUPDATEQDELETE语句时会(x)隐含着打开游标Qƈ在执行结束后关闭。所以此值对于开发h员来说一直是falseQ实际开发中不需要此属?/p>

QBQ?SQL%FOUND

用于定SQL语句是否执行成功Q当SQL语句有作用行Ӟ它ؓ(f)TRUEQ否则ؓ(f)FALSEQ如Q?/p>

DECLARE

  v_dept emp.deptno
% TYPE;

BEGIN

  
UPDATE  emp  SET  sal = sal * 1.1   WHERE  deptno =& no;

  
if  SQL % FOUND  then

      dbms_output.put_line(
' 语句执行成功 ' );

   
else

      dbms_output.put_line(
' 语句执行p| ' );

   
end   if ;

END ;


QCQ与SQL%FOUND相反的就是SQL%NOTFOUND

QDQSQL%ROWCOUNT Q用于返回SQL语句作用的行?/p>

Q三Q事务控制语?/p>

在PL/SQL中同样可以用COMMITQROLLBACKQSAVEPOINT{事务控制语句,与直接用没有什么不同?/p>

dennis 2007-02-11 19:57 发表评论
]]>
PL/SQL学习(fn)W记(? ——PL/SQL代码~写规则http://www.aygfsteel.com/killme2008/archive/2007/02/11/99283.htmldennisdennisSun, 11 Feb 2007 11:56:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99283.htmlhttp://www.aygfsteel.com/killme2008/comments/99283.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99283.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/99283.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/99283.html

L良好的代码编写习(fn)?PL/SQL代码~写规则:

1.标识W命名规?/p>

1)定义变量时以v_作ؓ(f)前缀,如v_sal

2)定义帔R时以c_作ؓ(f)前缀,如c_rate

3)定义游标?使用_cursor作ؓ(f)后缀,如emp_cursor

4)定义异常?以e_作ؓ(f)前缀Q如e_integrity_error

5)定义PL/SQL表类型时,使用_table_type作ؓ(f)后缀,如sal_table_type.

6)定义表变量时,以_table作ؓ(f)后缀,如sal_table

7)同样Q定义PL/SQL记录型时以_record_type作ؓ(f)后缀

8)定义PL/SQL记录变量时以_record作ؓ(f)后缀

 

2.大小写规?

1)SQL关键字采用大写,比如SELECT,DELETE{?/p>

2)PL/SQL关键字也用大?比如DECLARE,BEGIN,END{?/p>

3)数据cd也采用大写,比如VARCHA2

4)标识W和参数采用写Q如v_sal

5)数据库对象和列以?qing)别名也才用?/p>

3.合适的代码~进风格



dennis 2007-02-11 19:56 发表评论
]]>
PL/SQL学习(fn)W记(? http://www.aygfsteel.com/killme2008/archive/2007/02/11/99282.htmldennisdennisSun, 11 Feb 2007 11:55:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99282.htmlhttp://www.aygfsteel.com/killme2008/comments/99282.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99282.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/99282.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/99282.html 定义q用变?/strong>

PL/SQL有四U类?标量cd,复合cd,引用cd(reference),LOB(Large Obejct)cd

一.标量cd

最常用的就是标量类型,是指只能存放单个数值的变量,包括数字cd、字W类型、日期类型和布尔cdQ每U类型又包含相应的子cd?/p>

帔R标量cd如下Q?/p>

 

VARCHAR2 (n) , CHAR (n), NUMBER (p,s),DATE, TIMESTAMP , LONG , LONG   RAW ,BOOLEAN,BINARY_INTEGER(仅PL / SQL使用Q,BINARY_FLOAT和BINARY_DOUBLE(10g新引入的Q?/span>

 

定义标量Q?/p>

identifier [CONSTANT] datatype [NOT NULL] [:=| DEFAULT expr]

使用标量需要注意的?可:=取代Q与delphi一L(fng)赋值符号@_@

例子Q?/p>

 

v_name  VARCHAR2 ( 10 );

v_rate CONSTANTS 
NUMBER ( 4 , 2 ) : = 3.04 ;

 

Z防止定义的变量类型与表中的字D늱型不一_(d)可以使用%TYPE来定义:(x)

 

v_name employee.name % TYPE;

 

如上面所C,v_name的类型就与表employee中的name字段cd一PQ?/p>

二。复合变量:(x)

用于存放多个值的变量UCؓ(f)复合变量Q包括PL/SQL记录QPL/SQL表,嵌套表和VARRAY四种cd

1。PL/SQL记录

cM于C/C++中的l构概念Q?/p>

 

declare
   TYPE employee_record 
is  RECORD(
     id employee.id
% TYPE,
     name employee.name
% TYPE,
     email employee.email
% TYPE);
   em_record employee_record;
begin
   
select  id,name,email  into  em_record  from  employee  where  name =& name;
   dbms_output.put_line(
' 雇员? ' || em_record.name || '  雇员I(y)DQ?/span> ' || em_record.id);
end

 

2。PL/SQL表,cM于数l概念,不同的是PL/SQL表允许负g标,而且没有上下限,如:(x)

 

declare
   TYPE employee_table 
is   table   of  employee.name % TYPE  index   by  BINaRY_INTEGER;
   em_table employee_table;
begin
   
select  name  into  em_table( - 1 from  employee  where  name =& name;
   dbms_output.put_line(
' 雇员? ' || em_table( - 1 ));
end

 

3。嵌套表Q与PL/SQL表相|不同的是嵌套表可以做表列的数据类型,而PL/SQL表不能,使用嵌套表作列时Q必Mؓ(f)其指定专门的存储表,如:(x)

 

create   or   replace  TYPE emp_type   as  OBJECT(
  name 
VARCHAR2 ( 10 ),salary  NUMBER ( 6 , 2 ),hiredate DATE);

CREATE   OR   REPLACE  TYPE emp_array  IS   TABLE   OF  emp_typeQ?br />
 
CREATE   TABLE  department(
    deptno 
NUMBER ( 2 ),dname  VARCHAR2 ( 10 ),
    employee emp_array)NESTED 
TABLE  employee STORE  as  employee_dept;

 

4。VARRAY(变长数组Q,与嵌套表怼Q也可以做ؓ(f)表列的数据类型,但是嵌套表没有个数限Ӟ而VARRAY有个数限Ӟ如:(x)

CREATE TYPE TEST_ARRAY IS VARRAY(20) OF emp_type;

三。引用变量(referenceQ?/p>

cM于C++中的指针或者JAVA中引用的概念Q用于存放数值指针的变量Q用此变量Q可以得应用程序共享相同对象,降低占用I间。此cL两种cdQ游标(REF CURSORQ和对象cdQREF OBJECTQ?/p>

1。REF CURSORQ定义时同时指定SELECT语句的游标称为显式或者静态游标,在打开时才指定SELECT语句的游标称为动态游标,如:(x)

 

  DECLARE  
     TYPE c1 
IS  REF  CURSOR ;
     emp_cursor c1;
     v_name employee.name
% TYPE;
     v_sal employee.salary
% TYPE;
    
begin
     
open  emp_cursor  for
       
SELECT  name,salary  FROM  EMPLOYEE ;
     LOOP
       
FETCH  emp_cursor  INTO  v_name,v_sal;
       
EXIT   WHEN  emp_cursor % NOTFOUND;
       dbms_output.put_line(v_name);
     
END  LOOP;
     
close  emp_cursor;
    
end ;  

  

2。REF OBJECTQ与JAVA的引用概늛同,存储的是指向对象的指?/p>

 

四。LOBcd

LOBcd是指用于存储大批量数据的变量Q包括内部的3U(CLOBQBLOBQNCLOBQ和外部LOBQBFILEQ?/p>

CLOBQNCLOB用于存储大量的字W数据?/p>

BLOB用于存储大批量二q制数据Q如图象Q?/p>

BFILE则存储指向OS文g的指针?/p>

dennis 2007-02-11 19:55 发表评论
]]>
PL/SQL学习(fn)W记(一) http://www.aygfsteel.com/killme2008/archive/2007/02/11/99281.htmldennisdennisSun, 11 Feb 2007 11:52:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99281.htmlhttp://www.aygfsteel.com/killme2008/comments/99281.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/02/11/99281.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/99281.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/99281.html断断l箋学过Q这ơ系l地来读诅R?/p>

Q一Q?/p>

PL/SQL是oracle在标准SQL语言上的q程性扩?它不仅允许嵌入SQL语句,而且允许定义变量和常?允许q程语言l构(条g语句和@环语?,允许使用异常处理oracle错误{。通过使用PL/SQLQ可以在一个PL/SQL块中包含多条SQL语句和PL/SQL语句。PL/SQLh以下优点Q?/p>

1。提高应用系l的q行性能?/p>

通过使用PL/SQL块包含多条SQL语句Q从而减了SQL语句的发送次敎ͼ降低了网l开销Q提高了应用E序性能

2。提供模块化的程序设计功能?/p>

企业规则和商业逻辑集成到PL/SQL子程序当中,提供l客L(fng)调用Q简化了客户端应用程序的开发和l护工作Q降低了耦合?/p>

3。允许定义标识符Q允许定义变量、常量、游标和异常{标识符

4。具有过E语a控制l构Q允怋用条件分支语句和循环语句

5。具有良好的兼容性,在允许运行oracle的Q何^C执行Q不仅在数据库服务端执行Q也可以在oracle提供的工具中开发PL/SQL

6。处理运行错误,使用PL/SQL提供的EXCEPTIONQ开发h员可以集中处理各Uoracle错误和PL/SQL错误Q简化了错误处理?/p>

Q二Q?/p>

PL/SQL块的概念Q?/p>

Block是PL/SQL的基本单元,~写PL/SQL本质上就是编写PL/SQL块,块的嵌套层次没有限制?/p>

1。块的结构:(x)块由3部分l成

 

DECLARE  

  定义部分——定义常量,变量Q游标,异常Q复杂数据类型等

BEGIN

  执行部分

EXCEPTION

  异常处理部分

END /* 块结束标?/span> */

 

其中只有执行部分是必ȝQ?/p>

2。分c:(x)

1Q匿名块Q匿名块是指没有名称的PL/SQL块,可以内嵌到应用程序中Q如Q?/p>

declare
    v_name 
VARCHAR2 ( 10 );

BEGIN
    
select  name  into  v_name  from  test  where  name =& no;
    dbms_output.put_line(
' 名字: ' || v_name);
    EXCEPTION
    
WHEN  NO_DATA_FOUND  THEN
    dbms_output.put_line(
' 找不到该名字 ' );
end ;


2Q命名块Q与匿名块相|使用命名块主要是Z区分多嵌套关系Q如Q?/p>

<< out >>

declare
    v_name 
VARCHAR2 ( 10 );

BEGIN

    
<< inner >>

    
begin

           
null ;

    
end ;

    
-- <<inner>>

    
    
select  name  into  v_name  from  test  where  name =& no;
    dbms_output.put_line(
' 名字: ' || v_name);
    EXCEPTION
    
WHEN  NO_DATA_FOUND  THEN
    dbms_output.put_line(
' 找不到该名字 ' );
end -- <<outer>>


3Q子E序Q又可以分成3U:(x)q程、函数和?/p>

A。过E用于执行特定操作,当徏立过E时既可以指定输入参敎ͼ也可以指定输出参敎ͼ从而在应用环境和程序间传递数据,使用CREATE PROCEDURE语句Q如Q?/p>

  create   or   replace   PROCEDURE  update_test(id2  NUMBER ,money2  LONG )
 
is
    e_no_row EXCEPTION;
 
begin
    
update  test  set   money = money2  where  id = id2;
    
if  SQL % NOTFOUND  THEN
      RAISE e_no_row;
    
end   if ;
 EXCEPTION
    
WHEN   e_no_row  THEN
      raise_application_error(
- 20004 , ' 该test不存?/span> ' );
 
end  update_test;


BQ函敎ͼ与过E主要不同是函数需要返回数据,在函数头和函C都必LRETURN语句Q如Q?/p>

 

create   or   replace   FUNCTION  get_long(name2  VARCHAR2 )
RETURN   LONG   IS
  avg_money 
NUMBER ;
begin
  
select   money   into  avg_money  from  test  where  name = name2;
  
RETURN  avg_money;
end ;  

 

CQ包Q类似JAVA包的概念Q包含两部分Q包规范和包体,包规范相当于C++中的头文件声明子E序Q而包体包含这些子E序的具体实现。调用包中的子程序时Q需?‘包?子程序名?q样的Ş式调?/p>

4。触发器是指隐含执行的存储过E,定义触发器需要指定触发事件和触发操作Q常见触发事件如insert,update,delete{,使用CREATE TRIGGER命o(h)建立



dennis 2007-02-11 19:52 发表评论
]]>
վ֩ģ壺 | | | | ɽ| | | | ٰ| | | ½| ɽ| | | | | | | ˰| | | | | | | ں| ±| ˹| ³ľ| | | ̺| | ԭ| | | | | | ¡|