??xml version="1.0" encoding="utf-8" standalone="yes"?> 表结构:(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> 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 Oracle的查询语句:(x) select mla_parentid, mla_id, mla_name from main_node start with mla_id=? connect by prior mla_id=mla_parentid 如果不希望别的session lock/insert/update/delete表中L一行,只允许查询,可以用lock table table_name in exclusive mode?X)q个锁定模式U别最高,q发度最?br /> 在日志文件损坏或?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
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>
则表明从根节Ҏ(gu)向本节点Q?/li>
]]>
如果允许别的session查询或用select for update锁定记录Q不允许insert/update/deleteQ可以用lock table table_name in share row exclusive mode?SRX)
?
果允许别的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)
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
]]>
]]>
概述Q?br />
Oracle数据库是目前业界最常用的大型数据库pȝQ我在实际项目中遇到出现ORA-00257错误Q空间不错误)(j)Q通过查找资料Q绝大部分说q是׃归档日志太多Q占用了全部?a class="bluekey" target="_blank">盘剩余I间D的,通过单删除日志或加大存储I间p够解冟뀂但是我在Oracle 10g上发玎ͼ存储I间q有很大Q却也报q个错误。原来是Oracle 10g中新的特性,对Flash Recovery的管理导致的?
1、Yg环境
服务?/a>HP Proliant DL580G4QIntel Xeon 3.16GHz/4GB/ 72.8*4/RAID4)
操作pȝRed Flag DC Server release 5.0 (Trinity) for x86-64 Linux
数据库Oracle 10.2.0.1.0
2、问题现?/b>
数据库系l已l试q行了半个多月,??4日晚上连接数据库后做数据更新时出现ORA-00257错误Q如下图?br />
提示归档错误Q通过查找ORACLE错误代码Q解释ؓ(f)盘I间不Q需要删除归档日志增加空_(d)但是服务器可用空?00GBQ目前只用了10GB左右Q这是ؓ(f)什么呢Q?br />
3、诊断过E?/b>Q?br />
1Q查看ORACLE数据库归档日志情?br />[root@hrmsdb /]# cd /oracle/flash_recovery_area/HKCHR/archivelog
[root@hrmsdb archivelog]# ls
2006_07_04 2006_07_13 2006_07_17 2006_07_20 2006_07_23
2006_07_11 2006_07_14 2006_07_18 2006_07_21 2006_07_24
2006_07_12 2006_07_15 2006_07_19 2006_07_22 2006_07_25
[root@hrmsdb archivelog]# cd 2006_07_25
[root@hrmsdb 2006_07_25]# ls
[root@hrmsdb 2006_07_25]# cd ../2006_07_24
[root@hrmsdb 2006_07_24]# ls
o1_mf_1_92_2d933vgb_.arc o1_mf_1_96_2d954ns7_.arc o1_mf_1_98_2d969d5h_.arc
o1_mf_1_95_2d9537cs_.arc o1_mf_1_97_2d956km0_.arc
说明在出现问题之前数据库归档处理一直是正常的?br />
2Q查看数据库REDOLOG情况[oracle@hrmsdb ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期?7?25 10:44:18 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> connect / as sysdba
已连接?br />
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- --------------------------------------- --------------
1 1 101 52428800 1 NO CURRENT 3621973 24-7?-06
2 1 99 52428800 1 NO INACTIVE 3600145 24-7?-06
3 1 100 52428800 1 NO INACTIVE 3611932 24-7?-06
发现ARC状态ؓ(f)NOQ表C系l没法自动做归档?br />
3Q手工切换日?br />SQL> alter system switch logfile;
alter system switch logfile
*
W?1 行出现错?
ORA-01013: 用户h取消当前的操?br />
在等待长旉没反应后Q中断操作,手工切换日志没有成功?br />
4Q查看Oracle数据库后台归档服务进E?br />[oracle@hrmsdb ~]$ ps -ef|grep oracle
oracle 4601 1 0 Jul11 ? 00:00:04 /oracle/product/10.2.0/db_1/bin/
tnslsnr LISTENER -inherit
oracle 5025 1 0 Jul11 ? 00:00:00 /usr/bin/ssh-agent -s
oracle 20923 1 0 Jul24 ? 00:00:01 ora_pmon_hkchr
oracle 20925 1 0 Jul24 ? 00:00:00 ora_psp0_hkchr
oracle 20927 1 0 Jul24 ? 00:00:00 ora_mman_hkchr
oracle 20929 1 0 Jul24 ? 00:00:01 ora_dbw0_hkchr
oracle 20931 1 0 Jul24 ? 00:01:07 ora_lgwr_hkchr
oracle 20933 1 0 Jul24 ? 00:00:05 ora_ckpt_hkchr
oracle 20935 1 0 Jul24 ? 00:00:01 ora_smon_hkchr
oracle 20937 1 0 Jul24 ? 00:00:00 ora_reco_hkchr
oracle 20939 1 0 Jul24 ? 00:00:00 ora_cjq0_hkchr
oracle 20941 1 0 Jul24 ? 00:00:01 ora_mmon_hkchr
oracle 20943 1 0 Jul24 ? 00:00:05 ora_mmnl_hkchr
oracle 20945 1 0 Jul24 ? 00:00:00 ora_d000_hkchr
oracle 20947 1 0 Jul24 ? 00:00:00 ora_s000_hkchr
oracle 20953 1 0 Jul24 ? 00:09:41 ora_arc0_hkchr
oracle 20955 1 1 Jul24 ? 00:10:29 ora_arc1_hkchr
oracle 20959 1 0 Jul24 ? 00:00:00 ora_qmnc_hkchr
oracle 20967 1 0 Jul24 ? 00:00:00 ora_q000_hkchr
oracle 20969 1 0 Jul24 ? 00:00:00 ora_q001_hkchr
oracle 21715 1 0 Jul24 ? 00:00:19 oraclehkchr (LOCAL=NO)
oracle 21765 1 0 Jul24 ? 00:00:00 ora_j000_hkchr
oracle 21816 1 0 Jul24 ? 00:00:00 ora_j001_hkchr
oracle 21832 1 0 Jul24 ? 00:00:00 ora_j002_hkchr
oracle 21839 1 0 Jul24 ? 00:00:00 ora_j003_hkchr
oracle 21859 1 0 Jul24 ? 00:00:00 ora_j004_hkchr
oracle 21861 1 0 Jul24 ? 00:00:00 ora_j005_hkchr
oracle 21886 1 0 Jul24 ? 00:00:00 ora_j006_hkchr
oracle 21888 1 0 Jul24 ? 00:00:00 ora_j007_hkchr
root 23187 23186 0 10:39 ? 00:00:00 login -- oracle
oracle 23188 23187 0 10:39 pts/0 00:00:00 -bash
oracle 23216 23188 0 10:39 pts/0 00:00:00 sqlplus
oracle 23217 23216 0 10:39 ? 00:00:00 oraclehkchr (DESCRIPTION=(LOCAL=
YES)(ADDRESS=(PROTOCOL=beq)))
root 23224 23223 0 10:40 ? 00:00:00 login -- oracle
oracle 23225 23224 0 10:40 pts/1 00:00:00 -bash
oracle 23310 23225 0 10:46 pts/1 00:00:00 ps -ef
oracle 23311 23225 0 10:46 pts/1 00:00:00 grep oracle
[oracle@hrmsdb ~]$
后台q程都正常运行?/td>
5Q查看FLASH_RECOVERY_AREAI间使用情况[root@hrmsdb /]# cd /oracle
[root@hrmsdb oracle]# ls
admin flash_recovery_area oraInventory product
[root@hrmsdb oracle]# du -a -k flash_recovery_area
4 flash_recovery_area/HKCHR/onlinelog
42456 flash_recovery_area/HKCHR/archivelog/2006_07_15/o1_mf_1_74_2cj1h1jz_.arc
……………?
42448 flash_recovery_area/HKCHR/archivelog/2006_07_14/o1_mf_1_68_2cfzwwvt_.arc
512560 flash_recovery_area/HKCHR/archivelog/2006_07_14
1469224 flash_recovery_area/HKCHR/archivelog
6988 flash_recovery_area/HKCHR/backupset/2006_07_04/o1_mf_ncsnf_TAG20060704T1
74229_2bng1o0b_.bkp
876916 flash_recovery_area/HKCHR/backupset/2006_07_04/o1_mf_nnndf_TAG20060704T1
74229_2bng0cx4_.bkp
883908 flash_recovery_area/HKCHR/backupset/2006_07_04
883912 flash_recovery_area/HKCHR/backupset
2353144 flash_recovery_area/HKCHR
2353148 flash_recovery_area
[root@hrmsdb oracle]#
FLASH_RECOVERY_AREAI间使用?.35GB
6Q查看FLASH_RECOVERY_AREAI间中各部分使用情况SQL> select * from v$recovery_file_dest;
NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
------------------------------------------------------------------------------------------------------------------
/oracle/flash_recovery_area 2147483648 2134212608 0 35
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------- -------------- -------------- -------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 69.97 0 40
BACKUPPIECE 30.01 0 2
IMAGECOPY 0 0 0
FLASHBACKLOG 0 0 0
已选择6行?/td>
发现ARCHIVELOG占近70Q,BACKUPPIRCR占了30Q,q样FLASH_RECOVERY_AREAI间的空间已l被完全占据了?br />4、解册E?/b>
Ҏ(gu)数据库目前可用存储空间ؓ(f)200GB、FLASH_RECOVERY_AREAI间?GB的实际情况,把FLASH_RECOVERY_AREA的空间修改ؓ(f)20GB?br />SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=20g;
pȝ已更攏V?br />
SQL> select * from v$recovery_file_dest;
------------------------------------------------------- ---------- -----------------------------------
NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----------- ---------- ----------------- ------------- -------------- ---------- ---------- ------------
/oracle/flash_recovery_area 2.1475E+10 2264587776 0 38
q时再查看日志的状态,发现REDO LOG处于正常的归档状态?br />SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- -------------------------------------------- --------------
1 1 101 52428800 1 YES ACTIVE 3621973 24-7?-06
2 1 102 52428800 1 NO CURRENT 3650399 25-7?-06
3 1 100 52428800 1 YES INACTIVE 3611932 24-7?-06
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 7.6 0 43
BACKUPPIECE 4.21 0 2
IMAGECOPY 0 0 0
FLASHBACKLOG 0 0 0
已选择6行?br />
SQL>
5、小l?/strong>
造成本次故障的原因由两方面同时发生所造成的:(x)
·其一是Flash_Recovery_AreaI间~省安装时比较小Q只?GBQ容易用完;
·其二是由于采用归档方式通过Veritas备䆾Q由于备份Y件没有运行,造成归档日志没有?qing)时删除?br />
从本ơ故障解军_理中Q我们可以得出经验教训:(x)
·Oracle 10g数据库物理空间管理方式与以前Oracle发生了变化,对归档日志所在的Flash_Recovery_AreaI间q行了另外限Ӟ
·Ҏ(gu)据库pȝ理员要对Oracle数据库归档日志、备份Y件运行状况定期检查,提前发现、处理可能发生的故障?br />
]]>
ORA-00312: 联机日志 1 U程 1:
看情冉|日志文g出错Q幸好是试服务器,把我q个对oracle理一H不通的家伙急坏了。马上baidu了下错误代码Q找C文章:(x)
OK,马上执行命o(h)Q?br />
我需要加Z对oracle基本故障处理斚w知识的学?fn)了?br />
]]>
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
]]>
使用集合操作W有以下一些限?
.对于LOB,VARRAY,嵌套表类来说Q集合操作符无效
.对于LONG?UNION ALL,INTERSECT和MINUS无效
.如果选择列表包含了表辑ּ,必须指定别名
1。UNIONQ用于获取两个结果集的ƈ集,?x)自动去掉结果集中的重复行,q会(x)以第一列的l果q行排序Q例Q?/p>
2。UNION ALLQ与UNION怼Q不同的是UNION ALL不会(x)自动d重复行,也不?x)以M列排?/p>
3。INTERSECTQ用于获取两个结果集的交集,q且以第一列排序,如:(x)
4。MINUSQ用于获取结果集的差集(或者说补集Q,昄W一个结果集存在的,W?个结果集不存在的数据Q?/p>
注意事项Q?/p>
1。两个选择列表必须完全一?/p>
2。可以连l用集合操作符Q这些操作符拥有相同优先U,多个操作W存在时Q从左向x行,如:(x)
~写控制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>
二。CASE语句Q?/p>
各种语言的switch ...case语句相同Q只不过没有switch关键字?/p>
1。用单一选择W进行比较:(x)
END CASE;
2。多U条件比较:(x)
Q三Q@环语句:(x)
3U@环:(x)
1。基本@环,臛_执行一ơ:(x)
LOOP
statement1;
...
EXIT WHEN 退出@环条?
END LOOP1;
例如Q?/p>
2。while循环Q?/p>
WHILE conditon1 LOOP
statement1;
...
END LOOP;
比如上面的例子改写ؓ(f)Q?/p>
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>
(一)(g)索单行数?/p>
在PL/SQL嵌入select语句,使用Ҏ(gu):
SELECT select_list INTO variable_name1,variable_name2,variable_name3... FROM TABLE WHRE condition
?
需要注意事?
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>
QCQ与SQL%FOUND相反的就是SQL%NOTFOUND
QDQSQL%ROWCOUNT Q用于返回SQL语句作用的行?/p>
Q三Q事务控制语?/p>
在PL/SQL中同样可以用COMMITQROLLBACKQSAVEPOINT{事务控制语句,与直接用没有什么不同?/p>
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.合适的代码~进风格
PL/SQL有四U类?标量cd,复合cd,引用cd(reference),LOB(Large Obejct)cd
一.标量cd
最常用的就是标量类型,是指只能存放单个数值的变量,包括数字cd、字W类型、日期类型和布尔cdQ每U类型又包含相应的子cd?/p>
帔R标量cd如下Q?/p>
定义标量Q?/p>
identifier [CONSTANT] datatype [NOT NULL] [:=| DEFAULT expr]
使用标量需要注意的?可:=取代Q与delphi一L(fng)赋值符号@_@
例子Q?/p>
Z防止定义的变量类型与表中的字D늱型不一_(d)可以使用%TYPE来定义:(x)
如上面所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>
2。PL/SQL表,cM于数l概念,不同的是PL/SQL表允许负g标,而且没有上下限,如:(x)
3。嵌套表Q与PL/SQL表相|不同的是嵌套表可以做表列的数据类型,而PL/SQL表不能,使用嵌套表作列时Q必Mؓ(f)其指定专门的存储表,如:(x)
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)
2。REF OBJECTQ与JAVA的引用概늛同,存储的是指向对象的指?/p>
四。LOBcd
LOBcd是指用于存储大批量数据的变量Q包括内部的3U(CLOBQBLOBQNCLOBQ和外部LOBQBFILEQ?/p>
CLOBQNCLOB用于存储大量的字W数据?/p>
BLOB用于存储大批量二q制数据Q如图象Q?/p>
BFILE则存储指向OS文g的指针?/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成
其中只有执行部分是必ȝQ?/p>
2。分c:(x)
1Q匿名块Q匿名块是指没有名称的PL/SQL块,可以内嵌到应用程序中Q如Q?/p>
2Q命名块Q与匿名块相|使用命名块主要是Z区分多嵌套关系Q如Q?/p>
3Q子E序Q又可以分成3U:(x)q程、函数和?/p>
A。过E用于执行特定操作,当徏立过E时既可以指定输入参敎ͼ也可以指定输出参敎ͼ从而在应用环境和程序间传递数据,使用CREATE PROCEDURE语句Q如Q?/p>
BQ函敎ͼ与过E主要不同是函数需要返回数据,在函数头和函C都必LRETURN语句Q如Q?/p>
CQ包Q类似JAVA包的概念Q包含两部分Q包规范和包体,包规范相当于C++中的头文件声明子E序Q而包体包含这些子E序的具体实现。调用包中的子程序时Q需?‘包?子程序名?q样的Ş式调?/p>
4。触发器是指隐含执行的存储过E,定义触发器需要指定触发事件和触发操作Q常见触发事件如insert,update,delete{,使用CREATE TRIGGER命o(h)建立