﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-tbwshc-文章分类-oracle</title><link>http://www.blogjava.net/tbwshc/category/51844.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 06 Jun 2012 20:42:43 GMT</lastBuildDate><pubDate>Wed, 06 Jun 2012 20:42:43 GMT</pubDate><ttl>60</ttl><item><title>plsql函数大全</title><link>http://www.blogjava.net/tbwshc/articles/380012.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 05 Jun 2012 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/articles/380012.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/380012.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/articles/380012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/380012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/380012.html</trackback:ping><description><![CDATA[　　1.SQL中的单记录函数1.ASCII返回与指定的字符对应的十进制数;SQL&gt; select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;<br />　　<br />　　A　　　　　A　　　　　ZERO　　 SPACE<br />　　--------- --------- --------- ---------<br />　　65　　　　 97　　　　48　　　　32<br />　　<br />　　2.CHR给出整数,返回对应的字符;SQL&gt; select chr(54740) zhao,chr(65) chr65 from dual;<br />　　<br />　　ZH C-- -赵 A<br />　　<br />　　3.CONCAT连接两个字符串;SQL&gt; select concat('010-','88888888')||'转23'　高乾竞电话 from dual;<br />　　<br />　　<a href="http://www.tbwshc.com"><span style="color: #000000">TB</span></a>高乾竞电话<br />　　----------------<br />　　010-88888888转23<br />　　<br />　　4.INITCAP返回字符串并将字符串的第一个字母变为大写;SQL&gt; select initcap('smith') upp from dual;<br />　　<br />　　UPP-----Smith<br />　　<br />　　5.INSTR(C1,C2,I,J)在一个字符串中搜索指定的字符,返回发现指定的字符的位置;C1　被搜索的字符串&nbsp;&nbsp;&nbsp; C2 希望搜索的字符串&nbsp; I 搜索的开始位置,默认为1， J 出现的次数,默认为1；若I为负数，则从尾部开始搜索。<br />&nbsp; SQL&gt; select instr('oracle traning','ra',1,2) instring from dual;<br />　　<br />　　INSTRING<br />　　---------<br />　　　　　　9<br />　　<br />　　6.LENGTH返回字符串的长度;SQL&gt; select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;<br />　　<br />　　NAME　 LENGTH(NAME) ADDR　　　　　　 LENGTH(ADDR)　　　 SAL LENGTH(TO_CHAR(SAL))<br />　　------ ------------ ---------------- ------------ --------- --------------------<br />　　高乾竞　　　　　　3 北京市海锭区　　　　　　　　6　 9999.99　　　　　　　　　　7<br />　　<br />　　7.LOWER返回字符串,并将所有的字符小写SQL&gt; select lower('AaBbCcDd')AaBbCcDd from dual;<br />　　<br />　　AABBCCDD<br />　　--------<br />　　aabbccdd<br />　　<br />　　8.UPPER返回字符串,并将所有的字符大写SQL&gt; select upper('AaBbCcDd') upper from dual;<br />　　<br />　　UPPER<br />　　--------<br />　　AABBCCDD<br />　　<br />　　9.RPAD和LPAD(粘贴字符)RPAD　在列的右边粘贴字符LPAD　在列的左边粘贴字符SQL&gt; select lpad(rpad('gao',10,'*'),17,'*')from dual;<br />　　<br />　　LPAD(RPAD('GAO',1<br />　　-----------------<br />　　*******gao*******不够字符则用*来填满<br />　　<br />　　10.LTRIM和RTRIM&nbsp; LTRIM　删除左边出现的字符串RTRIM　删除右边出现的字符串SQL&gt; select ltrim(rtrim('　 gao qian jing　 ',' '),' ') from dual;<br />　　<br />　　LTRIM(RTRIM('<br />　　-------------<br />　　gao qian jing<br />　　<br />　　11.SUBSTR(string,start,count)取子字符串,从start开始（如果start是负数，从尾部开始）,取count个SQL&gt; select substr('13088888888',3,8) from dual;<br />　　<br />　　SUBSTR('<br />　　--------<br />　　08888888<br />　　<br />　　12.REPLACE('string','s1','s2')string　 希望被替换的字符或变量 s1　　　 被替换的字符串s2　　　 要替换的字符串SQL&gt; select replace('he love you','he','i') from dual;<br />　　<br />　　REPLACE('H<br />　　----------<br />　　i love you<br />　　<br />　　13.SOUNDEX返回一个与给定的字符串读音相同的字符串SQL&gt; create table table1(xm varchar(8));SQL&gt; insert into table1 values('weather');SQL&gt; insert into table1 values('wether');SQL&gt; insert into table1 values('gao');<br />　　<br />　　SQL&gt; select xm from table1 where soundex(xm)=soundex('weather');<br />　　<br />　　XM<br />　　--------<br />　　weatherwether<br />　　<br />　　14.TRIM('s' from 'string')LEADING　 剪掉前面的字符TRAILING　剪掉后面的字符如果不指定,默认为空格符<br />　　<br />　　15.ABS返回指定值的绝对值SQL&gt; select abs(100),abs(-100) from dual;<br />　　<br />　　ABS(100) ABS(-100)<br />　　--------- ---------<br />　　100　　　 100<br />　　<br />　　16.ACOS给出反余弦的值SQL&gt; select acos(-1) from dual;<br />　　<br />　　ACOS(-1)<br />　　---------<br />　　3.1415927<br />　　<br />　　17.ASIN给出反正弦的值SQL&gt; select asin(0.5) from dual;<br />　　<br />　　ASIN(0.5)<br />　　---------<br />　　.52359878<br />　　<br />　　18.ATAN返回一个数字的反正切值SQL&gt; select atan(1) from dual;<br />　　<br />　　ATAN(1)<br />　　---------<br />　　.78539816<br />　　<br />　　19.CEIL返回大于或等于给出数字的最小整数SQL&gt; select ceil(3.1415927) from dual;<br />　　<br />　　CEIL(3.1415927)<br />　　---------------<br />　　4<br />　　<br />　　20.COS返回一个给定数字的余弦SQL&gt; select cos(-3.1415927) from dual;<br />　　<br />　　COS(-3.1415927)<br />　　---------------<br />　　-1<br />　　<br />　　21.COSH返回一个数字反余弦值SQL&gt; select cosh(20) from dual;<br />　　<br />　　COSH(20)---------242582598<br />　　<br />　　22.EXP返回一个数字e的n次方根SQL&gt; select exp(2),exp(1) from dual;<br />　　<br />　　EXP(2)　　EXP(1)<br />　　--------- ---------<br />　　7.3890561 2.7182818<br />　　<br />　　23.FLOOR对给定的数字取整数SQL&gt; select floor(2345.67) from dual;<br />　　<br />　　FLOOR(2345.67)<br />　　--------------<br />　　2345<br />　　<br />　　24.LN返回一个数字的对数值SQL&gt; select ln(1),ln(2),ln(2.7182818) from dual;<br />　　<br />　　LN(1)　　 LN(2) LN(2.7182818)<br />　　--------- --------- -------------<br />　　0 .69314718　　 .99999999<br />　　<br />　　25.LOG(n1,n2)返回一个以n1为底n2的对数 SQL&gt; select log(2,1),log(2,4) from dual;<br />　　<br />　　LOG(2,1)　LOG(2,4)<br />　　--------- ---------<br />　　0　　　　 2<br />　　<br />　　26.MOD(n1,n2)返回一个n1除以n2的余数SQL&gt; select mod(10,3),mod(3,3),mod(2,3) from dual;<br />　　<br />　　MOD(10,3)　MOD(3,3)　MOD(2,3)<br />　　--------- --------- ---------<br />　　1　　　　　0　　　　 2<br />　　<br />　　27.POWER返回n1的n2次方根SQL&gt; select power(2,10),power(3,3) from dual;<br />　　<br />　　POWER(2,10) POWER(3,3)<br />　　----------- ----------<br />　　1024　　　　 27<br />　　<br />　　28.ROUND和TRUNC按照指定的精度进行舍入SQL&gt; select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;<br />　　<br />　　ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)<br />　　----------- ------------ ----------- ------------<br />　　56　　　　　-55　　　　　55　　　　　-55<br />　　<br />　　29.SIGN取数字n的符号,大于0返回1,小于0返回-1,等于0返回0SQL&gt; select sign(123),sign(-100),sign(0) from dual;<br />　　<br />　　SIGN(123) SIGN(-100)　 SIGN(0)<br />　　--------- ---------- ---------<br />　　1　　　　 -1　　　　 0<br />　　<br />　　30.SIN返回一个数字的正弦值SQL&gt; select sin(1.57079) from dual;<br />　　<br />　　SIN(1.57079)<br />　　------------<br />　　1<br />　　<br />　　31.SIGH返回双曲正弦的值SQL&gt; select sin(20),sinh(20) from dual;<br />　　<br />　　SIN(20)　SINH(20)<br />　　--------- ---------<br />　　.91294525 242582598<br />　　<br />　　32.SQRT返回数字n的根SQL&gt; select sqrt(64),sqrt(10) from dual;<br />　　<br />　　SQRT(64)　SQRT(10)<br />　　--------- ---------<br />　　8 3.1622777<br />　　<br />　　33.TAN返回数字的正切值SQL&gt; select tan(20),tan(10) from dual;<br />　　<br />　　TAN(20)　 TAN(10)<br />　　--------- ---------<br />　　2.2371609 .64836083<br />　　<br />　　34.TANH返回数字n的双曲正切值SQL&gt; select tanh(20),tan(20) from dual;<br />　　<br />　　TANH(20)　 TAN(20)<br />　　--------- ---------<br />　　1 2.2371609<br />　　<br />　　35.TRUNC按照指定的精度截取一个数SQL&gt; select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;<br />　　<br />　　TRUNC1 TRUNC(124.16666,2)<br />　　--------- ------------------<br />　　100　　　　　　 124.16<br />　　<br />　　36.ADD_MONTHS增加或减去月份SQL&gt; select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;<br />　　<br />　　TO_CHA<br />　　------<br />　　200002SQL&gt; select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;<br />　　<br />　　TO_CHA<br />　　------<br />　　199910<br />　　<br />　　37.LAST_DAY返回日期的最后一天SQL&gt; select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;<br />　　<br />　　TO_CHAR(SY TO_CHAR((S<br />　　---------- ----------<br />　　2004.05.09 2004.05.10SQL&gt; select last_day(sysdate) from dual;<br />　　<br />　　LAST_DAY(S----------31-5月 -04<br />　　<br />　　38.MONTHS_BETWEEN(date2,date1)给出date2-date1的月份SQL&gt; select months_between('19-12月-1999','19-3月-1999') mon_between from dual;<br />　　<br />　　MON_BETWEEN<br />　　-----------<br />　　9SQL&gt;selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;<br />　　<br />　　MON_BETW<br />　　---------<br />　　-60<br />　　<br />　　39.NEW_TIME(date,'this','that')给出在this时区=other时区的日期和时间SQL&gt; select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time　2　(sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;<br />　　<br />　　BJ_TIME　　　　　　 LOS_ANGLES<br />　　------------------- -------------------<br />　　2004.05.09 11:05:32 2004.05.09 18:05:32<br />　　<br />　　40.NEXT_DAY(date,'day')给出日期date和星期x之后计算下一个星期的日期SQL&gt; select next_day('18-5月-2001','星期五') next_day from dual;<br />　　<br />　　NEXT_DAY<br />　　----------<br />　　25-5月 -01<br />　　<br />　　41.SYSDATE用来得到系统的当前日期SQL&gt; select to_char(sysdate,'dd-mm-yyyy day') from dual;<br />　　<br />　　TO_CHAR(SYSDATE,'<br />　　-----------------<br />　　09-05-2004 星期日trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒SQL&gt; select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,　2　to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;<br />　　<br />　　HH　　　　　　　　　HHMM<br />　　------------------- -------------------<br />　　2004.05.09 11:00:00 2004.05.09 11:17:00<br />　　<br />　　42.CHARTOROWID将字符数据类型转换为ROWID类型SQL&gt; select rowid,rowidtochar(rowid),ename from scott.emp;<br />　　<br />　　ROWID　　　　　　　ROWIDTOCHAR(ROWID) ENAME<br />　　------------------ ------------------ ----------<br />　　AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITHAAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLENAAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARDAAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES<br />　　<br />　　43.CONVERT(c,dset,sset)将源字符串 sset从一个语言字符集转换到另一个目的dset字符集SQL&gt; select convert('strutz','we8hp','f7dec') "conversion" from dual;<br />　　<br />　　conver<br />　　------<br />　　strutz<br />　　<br />　　44.HEXTORAW将一个十六进制构成的字符串转换为二进制<br />　　<br />　　45.RAWTOHEXT将一个二进制构成的字符串转换为十六进制<br />　　<br />　　46.ROWIDTOCHAR将ROWID数据类型转换为字符类型<br />　　<br />　　47.TO_CHAR(date,'format')SQL&gt; select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;<br />　　<br />　　TO_CHAR(SYSDATE,'YY<br />　　-------------------<br />　　2004/05/09 21:14:41<br />　　<br />　　48.TO_DATE(string,'format')将字符串转化为ORACLE中的一个日期<br />　　<br />　　49.TO_MULTI_BYTE将字符串中的单字节字符转化为多字节字符SQL&gt;　select to_multi_byte('高') from dual;<br />　　<br />　　TO--高<br />　　<br />　　50.TO_NUMBER将给出的字符转换为数字SQL&gt; select to_number('1999') year from dual;<br />　　<br />　　YEAR<br />　　---------<br />　　1999<br />　　<br />　　51.BFILENAME(dir,file)指定一个外部二进制文件SQL&gt;insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));<br />　　<br />　　52.CONVERT('x','desc','source')将x字段或变量的源source转换为descSQL&gt; select sid,serial#,username,decode(command,　2　0,'none',　3　2,'insert',　4　3,　5　'select',　6　6,'update',　7　7,'delete',　8　8,'drop',　9　'other') cmd　from v$session where type!='background';<br />　　<br />　　SID　　　　SERIAL#　　　　 USERNAME　　　　　　　　 CMD<br />　　--------- --------- ------------------------------ ------<br />　　1　　　　 1　　　　　　　　　　　none　　　　　　 2<br />　　1　　　　　　　　　　　　　　　　none　　　　　　 3<br />　　1　　　　　　　　　　　　　　　　none　　　　　　 4<br />　　1　　　　　　　　　　　　　　　　none　　　　　　 5<br />　　1　　　　　　　　　　　　　　　　none　　　　　　 6<br />　　1　　　　　　　　　　　　　　　　none　　　　　　 7<br />　　1275　　　　　　　　　　　　　　 none　　　　　　 8<br />　　1275　　　　　　　　　　　　　　 none　　　　　　 9<br />　　20 GAO　　　　　　　　　　　　　 select　　　　　 10<br />　　40 GAO　　　　　　　　　　　　　 none<br />　　<br />　　53.DUMP(s,fmt,start,length)DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值SQL&gt; col global_name for a30SQL&gt; col dump_string for a50SQL&gt; set lin 200SQL&gt; select global_name,dump(global_name,1017,8,5) dump_string from global_name;<br />　　<br />　　GLOBAL_NAME　　　　　　　　　　DUMP_STRING<br />　　------------------------------ --------------------------------------------------<br />　　ORACLE.WORLD　　　　　　　　　 Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D<br />　　<br />　　54.EMPTY_BLOB()和EMPTY_CLOB()这两个函数都是用来对大数据类型字段进行初始化操作的函数<br />　　<br />　　55.GREATEST返回一组表达式中的最大值,即比较字符的编码大小.SQL&gt; select greatest('AA','AB','AC') from dual;<br />　　<br />　　GR--ACSQL&gt; select greatest('啊','安','天') from dual;<br />　　<br />　　GR--天<br />　　<br />　　56.LEAST返回一组表达式中的最小值 SQL&gt; select least('啊','安','天') from dual;<br />　　<br />　　LE--啊<br />　　<br />　　57.UID返回标识当前用户的唯一整数SQL&gt; show userUSER 为"GAO"SQL&gt; select username,user_id from dba_users where user_id=uid;<br />　　<br />　　USERNAME　　　　　　　　　　　　 USER_ID<br />　　------------------------------ ---------<br />　　GAO　　　　　　　　　　　　　　　　　 25<br />　　<br />　　58.USER返回当前用户的名字SQL&gt; select user from　dual;<br />　　<br />　　USER<br />　　------------------------------<br />　　GAO<br />　　<br />　　59.USEREVN返回当前用户环境的信息,opt可以是:ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZEISDBA　查看当前用户是否是DBA如果是则返回trueSQL&gt; select userenv('isdba') from dual;<br />　　<br />　　USEREN------FALSESQL&gt; select userenv('isdba') from dual;<br />　　<br />　　USEREN------TRUESESSION返回会话标志SQL&gt; select userenv('sessionid') from dual;<br />　　<br />　　USERENV('SESSIONID')<br />　　--------------------<br />　　152ENTRYID返回会话人口标志SQL&gt; select userenv('entryid') from dual;<br />　　<br />　　USERENV('ENTRYID')<br />　　------------------<br />　　0INSTANCE返回当前INSTANCE的标志SQL&gt; select userenv('instance') from dual;<br />　　<br />　　USERENV('INSTANCE')<br />　　-------------------<br />　　1LANGUAGE返回当前环境变量SQL&gt; select userenv('language') from dual;<br />　　<br />　　USERENV('LANGUAGE')<br />　　----------------------------------------------------<br />　　SIMPLIFIED CHINESE_CHINA.ZHS16GBKLANG返回当前环境的语言的缩写SQL&gt; select userenv('lang') from dual;<br />　　<br />　　USERENV('LANG')<br />　　----------------------------------------------------<br />　　ZHSTERMINAL返回用户的终端或机器的标志SQL&gt; select userenv('terminal') from dual;<br />　　<br />　　USERENV('TERMINA<br />　　----------------<br />　　GAOVSIZE(X)返回X的大小(字节)数SQL&gt; select vsize(user),user from dual;<br />　　<br />　　VSIZE(USER) USER<br />　　----------- ------------------------------<br />　　6 SYSTEM<br />　　<br />　　<br />　　<br />　　60.AVG(DISTINCT|ALL)all表示对所有的值求平均值,distinct只对不同的值求平均值SQLWKS&gt; create table table3(xm varchar(8),sal number(7,2));语句已处理。SQLWKS&gt;　insert into table3 values('gao',1111.11);SQLWKS&gt;　insert into table3 values('gao',1111.11);SQLWKS&gt;　insert into table3 values('zhu',5555.55);SQLWKS&gt; commit;<br />　　<br />　　SQL&gt; select avg(distinct sal) from gao.table3;<br />　　<br />　　AVG(DISTINCTSAL)<br />　　----------------<br />　　3333.33<br />　　<br />　　SQL&gt; select avg(all sal) from gao.table3;<br />　　<br />　　AVG(ALLSAL)<br />　　-----------<br />　　2592.59<br />　　<br />　　61.MAX(DISTINCT|ALL)求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次SQL&gt; select max(distinct sal) from scott.emp;<br />　　<br />　　MAX(DISTINCTSAL)<br />　　----------------<br />　　5000<br />　　<br />　　62.MIN(DISTINCT|ALL)求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次SQL&gt; select min(all sal) from gao.table3;<br />　　<br />　　MIN(ALLSAL)<br />　　-----------<br />　　1111.11<br />　　<br />　　63.STDDEV(distinct|all)求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差SQL&gt; select stddev(sal) from scott.emp;<a href="http://www.tbwshc.com/"><span style="color: #000000">TB</span></a><br />　　<br />　　STDDEV(SAL)<br />　　-----------<br />　　1182.5032<br />　　<br />　　SQL&gt; select stddev(distinct sal) from scott.emp;<br />　　<br />　　STDDEV(DISTINCTSAL)<br />　　-------------------<br />　　1229.951<br />　　<br />　　64.VARIANCE(DISTINCT|ALL)求协方差<br />　　<br />　　SQL&gt; select variance(sal) from scott.emp;<br />　　<br />　　VARIANCE(SAL)<br />　　-------------<br />　　1398313.9<br />　　<br />　　65.GROUP BY主要用来对一组数进行统计SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno;<br />　　<br />　　DEPTNO　　　COUNT(*)　SUM(SAL)<br />　　---------　--------- ---------<br />　　10　　　　 3　　　8750<br />　　20　　　　 5　　 10875<br />　　30　　　　 6　　　9400<br />　　<br />　　66.HAVING对分组统计再加限制条件SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)&gt;=5;<br />　　<br />　　DEPTNO　COUNT(*)　SUM(SAL)<br />　　--------- --------- ---------<br />　　20　　　　 5　　 10875<br />　　30　　　　 6　　　9400SQL&gt; select deptno,count(*),sum(sal) from scott.emp having count(*)&gt;=5 group by deptno ;<br />　　<br />　　DEPTNO　COUNT(*)　SUM(SAL)<br />　　--------- --------- ---------<br />　　20　　　　 5　　 10875<br />　　30　　　　 6　　　9400<br />　　<br />　　67.ORDER BY用于对查询到的结果进行排序输出SQL&gt; select deptno,ename,sal from scott.emp order by deptno,sal desc;<br />　　<br />　　DEPTNO　　 ENAME　　　　SAL<br />　　--------- ---------- ---------<br />　　10 KING　　5000　　　 10 CLARK<br />　　2450　　　 10 MILLER<br />　　1300　　　 20 SCOTT<br />　　3000　　　 20 FORD<br />　　3000　　　 20 JONES<br />　　2975　　　 20 ADAMS<br />　　1100　　　 20 SMITH<br />　　800　　　　30 BLAKE<br />　　2850　　　 30 ALLEN<br />　　1600　　　 30 TURNER<br />　　1500　　　 30 WARD<br />　　1250　　　 30 MARTIN<br />　　1250　　　 30 JAMES <br /><img src ="http://www.blogjava.net/tbwshc/aggbug/380012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-06-05 12:43 <a href="http://www.blogjava.net/tbwshc/articles/380012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> PL/SQL编码规范</title><link>http://www.blogjava.net/tbwshc/articles/379912.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Mon, 04 Jun 2012 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/articles/379912.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/379912.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/articles/379912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/379912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/379912.html</trackback:ping><description><![CDATA[<h1><span>1.&nbsp;</span>PL/SQL<span style="font-family: 黑体">编码规范</span></h1>
<p style="text-indent: 21.25pt">PL/SQL<span style="font-family: 宋体">对大小写不敏感，故切忌使用大小写区分变量和其它用户定义的元素。为使代码具有可读性，可遵循以下简单的大小写规则以便在源代码中区分这些元素：</span></p>
<p style="text-indent: -21.25pt; margin: 0cm 0cm 0pt 42.5pt"><span style="font-family: Wingdings">&#178;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">全部保留字、</span>Oracle<span style="font-family: 宋体">提供的程序包、内建函数、用户定义的常数、</span>Oracle<span style="font-family: 宋体">和用户定义的数据类型，以及模式名均采用大写；</span></p>
<p style="text-indent: -21.25pt; margin: 0cm 0cm 0pt 42.5pt"><span style="font-family: Wingdings">&#178;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">所有程序命名和过程名称全部采用</span><span style="font-family: 宋体">大</span><span style="font-family: 宋体">写。</span></p>
<p style="text-indent: -21.25pt; margin: 0cm 0cm 0pt 42.5pt"><span style="font-family: Wingdings">&#178;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">修改前必须从</span>CVS<span style="font-family: 宋体">去取最新的版本去，同时如存在多个人同时修改的情况，请注意协调分工，注意事后合并版本。</span></p>
<p style="text-indent: -21.25pt; margin: 0cm 0cm 0pt 42.5pt"><span style="font-family: Wingdings">&#178;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">所有的包和过程等</span>PL/SQL<span style="font-family: 宋体">脚本，请将最新的放在</span>CVS<span style="font-family: 宋体">上</span>,</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21.2pt">\JCN\20Engineering\20.40SourceCode\PLSQL\<span style="font-family: 宋体">这个目录下。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21.2pt"><span style="font-family: 宋体">（</span>FUNCTION<span style="font-family: 宋体">和</span>PACKAGE<span style="font-family: 宋体">等要分开放）</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21.2pt">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21.25pt">&nbsp;<span>&nbsp;&nbsp;</span><span style="font-family: 宋体">文件的路径如下图片所示</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21.2pt"></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21.2pt">&nbsp;</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21.2pt"><span style="font-family: 宋体">如果是改修的，请到下图的</span>Baseline<span style="font-family: 宋体">下去取文件</span>,<span style="font-family: 宋体">然后保存到上述路径：</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21.2pt"></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21.2pt">&nbsp;</p>
<p style="text-indent: -21.25pt; margin: 0cm 0cm 0pt 42.5pt"><span style="font-family: Wingdings">&#178;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>PL/SQL<span style="font-family: 宋体">的包和包体将采用一个文件，名称为包的名字，保留到</span>CVS<span style="font-family: 宋体">将，请不要将包和包体分开为两个文件</span>update<span style="font-family: 宋体">到</span>CVS<span style="font-family: 宋体">。</span></p>
<p style="text-indent: -21.25pt; margin: 0cm 0cm 0pt 42.5pt"><span style="font-family: Wingdings">&#178;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">在提交到</span>CVS<span style="font-family: 宋体">上去以前，请清理掉临时的变量，和编码的时候采用的临时表等，并请格式化你的代码，不定期将会对代码进行</span>review<span style="font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 0pt 21.25pt">&nbsp;</p>
<h2><span>1.1. </span>PL/SQL<span style="font-family: 黑体">程序命名规范</span></h2>
<p style="text-indent: -29.25pt; margin: 0cm 0cm 0pt 50.25pt"><span>1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">无论是</span>PL/SQL<span style="font-family: 宋体">对象还是</span>PL/SQL<span style="font-family: 宋体">对象内部用的变量和游标等，都必须能从名称上能让人理解变量和游标的含义，而且一定要做好注释。</span></p>
<p style="text-indent: -29.25pt; margin: 0cm 0cm 0pt 50.25pt"><span>2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">传到</span>CVS<span style="font-family: 宋体">上的文本文件全部采用</span>&#8217;.sql&#8217;<span style="font-family: 宋体">作为文件名的后缀</span></p>
<h3><span>1.1.1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-family: 黑体">存储过程</span></h3>
<p><span style="font-family: 宋体">存储过程的命名必须符合USP_DETAILNAME格式，其中 USP表示是存储过程，DETAILNAME是与存储过程意义相关的意义的名称，如：USP_BUSINESS_RULE。</span></p>
<h3><span>1.1.2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-family: 黑体">软件包</span></h3>
<p><span style="font-family: 宋体">软件包的命名必须符合<span>PKG_ DETAILNAME格式，其中 PKG表示是软件包， DETAILNAME是与软件包意义相关的意义的名称，例如：PKG_SORCE_ALL。</span></span></p>
<h3><span>1.1.3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-family: 黑体">触发器</span></h3>
<p><span style="font-family: 宋体">触发器的的命名必须符合TRG_DETAILNAME格式，其中TRG表示是触发器，DETAILNAME是与触发器用途相关的意义的名称，具体可以参考已有的TRIGGER对象。</span></p>
<h3><span>1.1.4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-family: 黑体">函数</span></h3>
<p><span style="font-family: 宋体">&nbsp;</span><span style="font-family: 宋体">函数的命名必须符合FNC_DETAILNAME格式，其中FNC表示是函数，，DETAILNAME是与函数意义相关的意义名称，例如：FNC_SALARYCOUNT。</span></p>
<h3><span>1.1.5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-family: 黑体">变量</span>&amp;<span style="font-family: 黑体">游标</span></h3>
<p style="text-indent: -15.75pt; margin: 0cm 0cm 0pt 15.75pt"><span style="font-family: 宋体">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">变量的命名必须符合规约,请采用</span>&#8221;<span style="font-family: 宋体">XXX_variablename</span>&#8221; <span style="font-family: 宋体">开头,其中XXX表示变量的类型。Variablename表示变量名，如为函数传入参数请根据传入类型加上IN,OUT,INOUT 等，如: IN_NUM_CUST_CODE.</span></p>
<p>&nbsp;</p>
<p style="text-indent: -15.75pt; margin: 0cm 0cm 0pt 15.75pt"><span style="font-family: 宋体">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如果依据表的字段请采用%type或者%rowtype方式。请不要直接定义变量。</span></p>
<p style="text-indent: 15.75pt"><span style="font-family: 宋体">如：</span><span style="font-family: 'MS Mincho'">NUM_CUST_CODE TableName.CUST_CODE%type</span></p>
<p>&nbsp;</p>
<p style="text-indent: -15.75pt; margin: 0cm 0cm 0pt 15.75pt"><span style="font-family: 宋体">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">显示游标请采用</span>&#8221; <span style="font-family: 宋体">CUR_</span>&#8221;<span style="font-family: 宋体">开头，在代码开头请说明，同时说明游标的定义.</span></p>
<p style="text-indent: 15.75pt"><span style="font-family: 宋体">如：CUR_CUST_INFO</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p style="text-indent: -15.75pt; margin: 0cm 0cm 0pt 15.75pt"><span style="font-family: 宋体">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">所有的变量前必须带上变量类型的标志,NUMBER型采用NUM,VARCAHR2 采用VAR，而在函数等入口的传入方法 IN_VAR_CUST_NAME,OUT_NUM_CODE,INOUT_NUM_CODE的方式来区分变量的类型是否位IN,OUT,INOUT类型</span></p>
<p style="text-indent: -15.75pt; margin: 0cm 0cm 0pt 15.75pt"><span style="font-family: 宋体">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">不能超过30个字符，不能采用关键字，要以字母开头。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: red"><strong>注</strong><a href="http://www.tbwshc.com"><strong style="color: #000000">tb</strong></a><strong>: 以上命名规则将主要在于新建对象时使用，如果在原有的PL/SQL对象的基础上修改，请按照原来代码的命名规范，注意做好代码的注释。同时必须在PL/SQL代码开头，做好注释说明。</strong></span></p><img src ="http://www.blogjava.net/tbwshc/aggbug/379912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-06-04 11:52 <a href="http://www.blogjava.net/tbwshc/articles/379912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中的PLsql的符号解释大全</title><link>http://www.blogjava.net/tbwshc/articles/379730.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Fri, 01 Jun 2012 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/articles/379730.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/379730.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/articles/379730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/379730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/379730.html</trackback:ping><description><![CDATA[<p>第二章 PL/SQL基础 <br />一、字符<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a>集</p>
<p>在PL/SQL程序中，允许出现的字符集包括： </p>
<p>大小写字母(A-Z和a-z) <br />数字(0-9) <br />符号( ) + - * / &lt; &gt; = ! ~ ^ ; : . &#8217; @ % , " # $ &amp; _ | { } ? [ ] <br />制表符、空格和回车符 <br />PL/SQL对大小写不敏感，所以，除了在字符串和字符中，小写字母和它对应的大写字母是等价的。 </p>
<p>二、词法单元</p>
<p>PL/SQL包含很多词法单元(lexical unit)，大致可以分为以下几类： </p>
<p>分隔符(简单符号和复合符号) <br />标识符，其中包括关键字 <br />文字 <br />注释 <br />为改善可读性，我们可以用空格将词法单元分隔开。实际上，我们必须将相邻的两个标识符用空格或标点符号隔开。下面这样的写法是不允许的，因为关键字END和IF连到一起了： </p>
<p>IF&nbsp; x &gt; y tdEN&nbsp; high := x; ENDIF; -- not allowed&nbsp; </p>
<p>还有，除了字符串和注释以外，我们不可以在词法单元中嵌入空格。例如，像下面的赋值符号中间就不用被分开： </p>
<p>count : = count + 1; -- not allowed&nbsp; </p>
<p>为了让层次结构清楚，我们可以用回车符来换行，空格或制表符来进行缩进。比较一下下面两段IF语句的可读性： </p>
<p>IF&nbsp; x&gt;y tdEN&nbsp; max:=x;ELSE&nbsp; max:=y;END&nbsp; IF ;&nbsp; IF&nbsp; x &gt; y tdEN <br />&nbsp; MAX&nbsp;&nbsp;&nbsp;&nbsp; := x;<br />ELSE <br />&nbsp; MAX&nbsp;&nbsp;&nbsp;&nbsp; := y;<br />END&nbsp; IF ;&nbsp; </p>
<p>1、分隔符</p>
<p>分隔符是对PL/SQL有着特殊意义的简单或复合的符号。例如，我们使用加号和减号这样的分隔符来表现数学运算。简单分隔符只有一个字符。 </p>
<p>符号 含义 <br />+ 加法操作符 <br />% 属性指示符 <br />&#8217; 字符串分隔符 <br />. 组件选择器 <br />/ 触法操作符 <br />( 表达式或列表分隔符 <br />) 表达式或列表分隔符 <br />: 主变量指示符 <br />, 分隔符 <br />* 多应用程序操作符 <br />" 引用标识符分隔符 <br />= 关系操作符 <br />&lt; 关系操作符 <br />&gt; 关系操作符 <br />@ 远程访问指示符 <br />; 语句终结符 <br />- 减号/负号操作符 </p>
<p>复合分割符由两个字符组成。</p>
<p>符号 含义 <br />:= 赋值操作符 <br />=&gt; 管联操作符 <br />|| 连接操作符 <br />** 求幂操作符 <br />&lt;&lt; 标签分隔符(开始) <br />&gt;&gt; 标签分隔符(结束) <br />/* 多行注视分隔符(开始) <br />*/ 多行注视分隔符(结束) <br />.. 范围操作符 <br />&lt;&gt; 关系操作符 <br />!= 关系操作符 <br />~= 关系操作符 <br />^= 关系操作符 <br />&lt;= 关系操作符 <br />&gt;= 关系操作符 <br />-- 单行注释提示符 </p>
<p>2、标识符</p>
<p>我们可以使用标识符来为PL/SQL程序中的常量、变量、异常、游标、游标变量、子程序和包命名。下面是一些标识符的例子： </p>
<p>X <br />t2 <br />phone# <br />credit_limit <br />LastName <br />oracle$number <br />标识符可以由字母、数字、美元符号($)、下划线(_)和数字符号(#)组成。而像连字符(-)、斜线(/)等符号都是不允许使用的。如下例: </p>
<p>mine&amp;yours -- 不允许使用连字符(not allowed because of ampersand) <br />debit-amount -- 不允许使用连字符(not allowed because of hyphen) <br />on/off -- 不允许使用斜线(not allowed because of slash) <br />user id -- 不允许使用空格(not allowed because of space) <br />而使用美元符号、下划线和数字符号都是允许的： </p>
<p>money$$$tree <br />SN## <br />try_again_ <br />我们也可以使用大小写混合的形式来编写标识符。但是要记住，除了字符串和字符以外，PL/SQL对大小写是不敏感的。所以，只在大小写上有区别的标识符，PL/SQL会把它们当做同一标识处理，如下例： </p>
<p>lastname <br />LastName -- 与lastname相同 <br />LASTNAME -- 与lastname和Lastname相同 <br />标识符的长度不能超过30。对于标识符的命名尽可能代表某种含义，避免使用像cpm这样的命名，而是使用cost_per_tdousand这样意义明确的命名方式。 </p>
<p>保留关键字 <br />对于某些标识符，我们称它们为保留关键字(reserved word)，因为对于PL/SQL来说，它们有着特殊含义，不可以被重新定义。例如BEGIN和END，它们代表块或子程序的起始和结束而被PL/SQL 保留下来。在下面的例子中，我们可以看到，如果重定义一个关键字的话，就会产生一个编译错误： </p>
<p>DECLARE <br />&nbsp; end BOOLEAN ; -- not allowed; causes compilation error&nbsp; </p>
<p>但像下面这样把保留关键字嵌套在标识符中使用是允许的： </p>
<p>DECLARE <br />&nbsp; end_of_game BOOLEAN ; -- allowed&nbsp; </p>
<p>通常，保留关键字都是以大写形式存在的，这样能够增强可读性。但是，跟其他PL/SQL标识符一样，保留关键字也可以使用小写或大小写混合的形式。 </p>
<p>预定义标识 <br />在包STANDARD中声明的全局标识符(如INVALID_NUMBER)是可以被重新声明的。但是，不建议重新声明预定义标识符，因为这样做的结果会使本地声明覆盖全局声明。 </p>
<p>引用标识符 <br />为了获取更多的灵活性，PL/SQL允许我们用双引号将标识符夹起来。这样的标识符很少使用，但有时它们非常有用。它们可以包含任何可打印字符，其中空格也包含在内，但是，不可以包含双引号。因此，下面这些引用标识符都是有效的： </p>
<p>"X+Y" <br />"last name" <br />"on/off switch" <br />"employee(s)" <br />"*** header info ***" <br />除了双引号以外，引用标识符最多可以包含30个字符。虽然把PL/SQL保留关键字作为引用标识符是被允许的，但这并不是一个好的编程习惯。 </p>
<p>有些PL/SQL保留关键字并不是SQL的保留关键字。例如，我们可以在CREATE TABLE语句中使用TYPE作为字段名。但是，如果程序中的SQL语句要引用到这个字段的话，就会发生编译错误： </p>
<p>SELECT&nbsp; acct, type, bal INTO&nbsp; ... -- causes compilation error&nbsp; </p>
<p>为了避免发生这样的错误，就需要把字段名用双引号夹起来： </p>
<p>SELECT&nbsp; acct, "TYPE", bal INTO&nbsp; ...&nbsp; </p>
<p>要注意的是，字段名不能采用小写或大小写混合的形式(CREATE TABLE语句中除外)。例如，下面的语句是无效的： </p>
<p>SELECT&nbsp; acct, "type", bal INTO&nbsp; ... -- causes compilation error&nbsp; </p>
<p>还有一种做法就是可以建立视图来为原来的字段名更换一个新名。 </p>
<p>3、文字</p>
<p>文字就是一个数字、字符、字符串或布尔(Boolean)值。它本身是数据而不是对数据的引用，如数字147和布尔值FALSE都是文字。 </p>
<p>数字文字 <br />在算术表达式中有两种数字文字可以使用：整数和实数。整数文字不带小数点，有一个可选的符号，例子如下： </p>
<p>030 6 -14 0 +32767&nbsp; </p>
<p>实数文字带有小数点，也有一个可选的符号，例子如下： </p>
<p>6.6667 0.0 -12.0 3.14159 +8300.00 .5 25.&nbsp; </p>
<p>PL/SQL把12.0和25.这样的数字都当作实数处理，虽然它们只有整数部分值。 </p>
<p>数字文字不能包含美元符号或是逗号，但可以使用科学记数法。只要在数字后面添加一个E(或e)，再跟上一个整数即可(符号可选)。比如下面几个例子： </p>
<p>2E5 1.0E-7 3.14159e0 -1E38 -9.5e-3&nbsp; </p>
<p>E代表了十的幂，即权(times ten to tde power of)。E后面的整数值代表指数。**是幂操作符。 </p>
<p>5E3 = 5 * 10**3 = 5 * 1000 = 5000<br />-- tde double asterisk (**) is tde exponentiation operator&nbsp; </p>
<p>在上面的例子里，小数点向右移动三个位置，而在下面这个例子中，我们把E后面的数字改成-3，就能让小数点向左移动三个位置： </p>
<p>5E-3 = 5 * 10**-3 = 5 * 0.001 = 0.005&nbsp; </p>
<p>再举一个例子。如果字符文字的范围不在1E-130到10E125之间，就会产生编译错误： </p>
<p>DECLARE <br />&nbsp; n NUMBER ;<br />BEGIN <br />&nbsp; n := 10E127;&nbsp;&nbsp; -- causes a 'numeric overflow or underflow' error&nbsp; </p>
<p>字符文字 <br />字符文字就是由单引号夹起来的一个单独的字符。字符文字包括PL/SQL字符集中所有的可打印字符：字母、数字、空格和特殊符号。如下例所示： </p>
<p>'Z' , '%' , '7' , ' ' , 'z' , '('&nbsp; </p>
<p>对于字符文字来说，PL/SQL是大小写敏感的。例如，PL/SQL会把'Z'和'z'当成不同的字符。字符'0'到'9'虽不与整数文字等价，但它们可以被应用于算术表达式中，因为它们会被隐式地转换成整数。 </p>
<p>字符串文字 <br />字符值可以用标识符来表示，或是写成字符串文字，字符串文字就是由单引号夹起来的零个或多个字符，如下例所示：</p>
<p>'Hello, world!' <br />'XYZ Corporation' <br />'10-NOV-91' <br />'He said "Life is like licking honey from a tdorn."' <br />'$1,000,000'&nbsp; </p>
<p>除了空字符串('')之外，所有的字符串文字都是CHAR类型。如果我们想表现一个单引号字符串的话，可以用两个连续的单引号来表示： </p>
<p>'Don' 't leave witdout saving your work.'&nbsp; </p>
<p>PL/SQL对字符串是大小写敏感的。例如，下面两个字符串是不相同的： </p>
<p>'baker' <br />'Baker'&nbsp; </p>
<p>布尔(Boolean)文字 <br />布尔文字可以用值TRUE、FALSE和NULL(表示缺失、未知或不可用的值)来表示。记住，布尔文字本身就是值，而不是字符串。</p>
<p>日期因类型的不同，有很多表现形式，比如下面的例子： <br />DECLARE <br />&nbsp; d1 DATE&nbsp; := DATE&nbsp; '1998-12-25' ;<br />&nbsp; t1 TIMESTAMP&nbsp; := TIMESTAMP&nbsp; '1997-10-22 13:01:01' ;<br />&nbsp; t2 TIMESTAMP&nbsp; WItd&nbsp; TIME&nbsp; ZONE&nbsp; := TIMESTAMP&nbsp; '1997-01-31 09:26:56.66 +02:00' ;<br />&nbsp; -- tdree years and two montds <br />&nbsp; -- (For greater precision, we would use tde day-to-second interval) <br />&nbsp; i1 INTERVAL&nbsp; YEAR&nbsp; TO&nbsp; MONtd&nbsp; := INTERVAL&nbsp; '3-2'&nbsp; YEAR&nbsp; TO&nbsp; MONtd ;<br />&nbsp; -- Five days, four hours, tdree minutes, two and 1/100 seconds <br />&nbsp; i2 INTERVAL&nbsp; DAY&nbsp; TO&nbsp; SECOND&nbsp; := INTERVAL&nbsp; '5 04:03:02.01'&nbsp; DAY&nbsp; TO&nbsp; SECOND ;<br />&nbsp; ...&nbsp; </p>
<p>我们可以指定间隔值是YEAR TO MONtd类型还是DAY TO SECOND类型。如： </p>
<p>current_timestamp - current_timestape&nbsp; </p>
<p>上面表达式的结果值类型默认是INTERVAL DAY TO SECONDE。我们还可以使用下面的方法来指定间隔类型： </p>
<p>(interval_expression) DAY TO SECOND <br />(interval_expression) YEAR TO MONtd <br />4、注释</p>
<p>PL/SQL编译器会忽略注释，但我们不可以这样做。添加注释能让我们的程序更加易读。通常我们添加注释的目的就是描述每段代码的用途。PL/SQL支持两种注释风格：单行和多行。 </p>
<p>单行注释 <br />单行注释由一对连字符(--)开头。如下例：</p>
<p>-- begin processing <br />SELECT&nbsp; sal INTO&nbsp; salary<br />&nbsp; FROM&nbsp; emp -- get current salary <br />&nbsp;WHERE&nbsp; empno = emp_id;<br />bonus := salary * 0.15; -- compute bonus amount&nbsp; </p>
<p>注释可以出现在一条语句的末端。在测试或调试程序的时候，有时我们想禁用某行代码，就可以用注释给它"注掉"(comment-out)，如下面的例子： </p>
<p>-- DELETE FROM emp WHERE comm IS NULL;&nbsp; </p>
<p>多行注释 <br />多行注释由斜线星号(/*)开头，星号斜线(*/)结尾，可以注释多行内容。示例如下：</p>
<p>BEGIN <br />&nbsp; ...<br />&nbsp; /* Compute a 15% bonus for top-rated employees. */ <br />&nbsp; IF&nbsp; rating &gt; 90 tdEN <br />&nbsp;&nbsp;&nbsp; bonus := salary * 0.15 /* bonus is based on salary */ <br />&nbsp; ELSE <br />&nbsp;&nbsp;&nbsp; bonus := 0;<br />&nbsp; END&nbsp; IF ;<br />&nbsp; ...<br />&nbsp; /* tde following line computes tde area of a<br />&nbsp; circle using pi, which is tde ratio between<br />&nbsp; tde circumference and diameter. */ <br />&nbsp; area := pi * radius**2;<br />END ;&nbsp; </p>
<p>我们可以使用多行注释注掉整块代码，如下例所示： </p>
<p>/*<br />LOOP<br />&nbsp; FETCH c1<br />&nbsp;&nbsp; INTO emp_rec;<br />&nbsp; EXIT WHEN c1%NOTFOUND;<br />&nbsp; ...<br />END LOOP;<br />*/&nbsp; </p>
<p>三、声明</p>
<p>在PL/SQL中，我们可以在块、子程序或包的声明部分来声明常量或变量。声明能够分配内存空间，指定数据类型，为存储位置进行命名以便我们能够引用这块存储空间。下面来看一下声明的例子： </p>
<p>birtdday&nbsp;&nbsp;&nbsp; DATE ;<br />emp_count&nbsp;&nbsp; SMALLINT&nbsp; := 0;&nbsp; </p>
<p>第一句声明了一个DATE类型的变量。第二句声明了SMALLINT类型的变量，并用赋值操作符指定了初始值零。下面再看一个稍微复杂一点的例子，用一个声明过的变量来初始化另一个变量：</p>
<p>pi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REAL&nbsp; := 3.14159;<br />radius&nbsp;&nbsp; REAL&nbsp; := 1;<br />area&nbsp;&nbsp;&nbsp;&nbsp; REAL&nbsp; := pi * radius ** 2;&nbsp; </p>
<p>默认情况下，变量是被初始化为NULL的。所以，下面两个声明是等价的：</p>
<p>birtdday&nbsp;&nbsp; DATE ;<br />birtdday&nbsp;&nbsp; DATE&nbsp; := NULL ;&nbsp; </p>
<p>对于常量声明要多加一个CONSTANT关键字：</p>
<p>credit_limit&nbsp;&nbsp; CONSTANT&nbsp; REAL&nbsp; := 5000.00;&nbsp; </p>
<p>常量在声明的时候必须进行初始化，否则就会产生编译错误。 </p>
<p>1、使用DEFAULT</p>
<p>我们可以使用关键字DEFAULT来替换赋值操作符为变量初始化。下面这个声明</p>
<p>blood_type&nbsp;&nbsp; CHAR&nbsp; := 'o' ;&nbsp; </p>
<p>就可以用DEFAULT来替换：</p>
<p>blood_type&nbsp;&nbsp; CHAR&nbsp; DEFAULT&nbsp; 'o' ;&nbsp; </p>
<p>我们可以使用DEFAULT来初始化子程序参数、游标参数和用户定义的记录中的域。</p>
<p>2、使用NOT NULL</p>
<p>除了在声明中做初始化操作外，还可以使用NOT NULL进行约束： </p>
<p>acct_id INTEGER (4) NOT&nbsp; NULL&nbsp; := 9999;&nbsp; </p>
<p>这样一来，我们就不能为变量acct_id指派空值了。如果这样做的话，PL/SQL就会抛出预定义异常VALUE_ERROR。NOT NULL约束后面必须跟着初始化子句。像下面这样的声明是不允许的： </p>
<p>acct_id INTEGER (5) NOT&nbsp; NULL ;&nbsp;&nbsp; -- not allowed; not initialized&nbsp; </p>
<p>NATURALN和POSITIVEN是PL/SQL提供的两个不可为空的预定义子数据类型。下面这两个声明是等价的： </p>
<p>emp_count NATURAL&nbsp; NOT&nbsp; NULL&nbsp; := 0;<br />emp_count NATURALN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := 0;&nbsp; </p>
<p>在NATURALN和POSITIVEN声明中，类型分类符后面必须跟上一个初始化子句。否则就会发生编译错误。例如，下面的声明就是不合法的： </p>
<p>line_items POSITIVEN ;&nbsp;&nbsp; -- not allowed; not initialized&nbsp; </p>
<p>3、使用%TYPE</p>
<p>%TYPE属性能够为我们提供变量或数据库字段的数据类型。在下面的例子中，%TYPE提供了变量credit的数据类型： </p>
<p>credit&nbsp;&nbsp; REAL (7, 2);<br />debit&nbsp;&nbsp;&nbsp; credit%TYPE ;&nbsp; </p>
<p>在引用数据库中某个字段的数据类型时，%TYPE显得更加有用。我们可以通过表名加字段来引用，或是使用所有者加表名加字段来引用： </p>
<p>my_dname scott.dept.dname%TYPE ;&nbsp; </p>
<p>使用%TYPE声明my_dname有两个好处。首先，我们不必知道dname具体的数据类型。其次，如果数据库中对dname的数据类型定义发生了改变，变量my_dname的数据类型也会在运行时作出相应的改变。但是要注意的是，%TYPE只提供类型信息，并不提供NOT NULL约束信息，所以下面这段代码即时是在emp.empno不可为空的情况下也是可以运行的： </p>
<p>DECLARE <br />&nbsp; my_empno emp.empno%TYPE ;<br />&nbsp; ...<br />BEGIN <br />&nbsp; my_empno := NULL ; -- tdis works&nbsp; </p>
<p>4、使用%ROWTYPE</p>
<p>%ROWTYPE属性提供数据表(或视图)中一整行数据的类型信息。记录可以完整地保存从游标或游标变量中取出的当前行的信息。下面例子中，我们声明了两个记录，第一个保存emp表的行信息，第二个保存从游标c1取出的行信息。 </p>
<p>DECLARE <br />&nbsp; emp_rec emp%ROWTYPE ;<br />&nbsp; CURSOR&nbsp; c1 IS&nbsp; <br />&nbsp;&nbsp;&nbsp; SELECT&nbsp; deptno, dname, loc FROM&nbsp; dept;<br />&nbsp; dept_rec c1%ROWTYPE ;&nbsp; </p>
<p>我们还可以为指定的域进行赋值操作，如下例：</p>
<p>emp_rec.ename := 'JOHNSON' ;<br />emp_rec.sal&nbsp;&nbsp; := emp_rec.sal * 1.15;&nbsp; </p>
<p>%ROWTYPE同%TYPE一样，只提供类型信息，并不能保证NOT NULL约束。在最后一个例子中，我们使用%ROWTYPE来定义一个打包游标(packaged cursor)： </p>
<p>CREATE&nbsp; PACKAGE&nbsp; emp_actions AS <br />&nbsp; CURSOR&nbsp; c1 RETURN&nbsp; emp%ROWTYPE ;&nbsp;&nbsp; -- declare cursor specification <br />&nbsp; ...<br />END&nbsp; emp_actions;<br />CREATE&nbsp; PACKAGE&nbsp; BODY&nbsp; emp_actions AS <br />&nbsp; CURSOR&nbsp; c1 RETURN&nbsp; emp%ROWTYPE&nbsp; IS&nbsp;&nbsp;&nbsp; -- define cursor body <br />&nbsp;&nbsp;&nbsp; SELECT&nbsp; * FROM&nbsp; emp WHERE&nbsp; sal &gt; 3000;<br />&nbsp; ...<br />END&nbsp; emp_actions;&nbsp; </p>
<p>聚合赋值 <br />用%ROWTYPE作声明的时候是不可以进行初始化赋值的，但是有两种方法可以一次性为所有字段赋值。方法一：假如两个记录类型的声明引用了同一数据表或游标，那么它们就可以相互赋值，如：</p>
<p>DECLARE <br />&nbsp; dept_rec1&nbsp;&nbsp; dept%ROWTYPE ;<br />&nbsp; dept_rec2&nbsp;&nbsp; dept%ROWTYPE ;<br />&nbsp; CURSOR&nbsp; c1 IS&nbsp; <br />&nbsp;&nbsp;&nbsp; SELECT&nbsp; deptno, dname, loc&nbsp; FROM&nbsp; dept;<br />&nbsp; dept_rec3&nbsp;&nbsp; c1%ROWTYPE ;<br />BEGIN <br />&nbsp; ...<br />&nbsp; dept_rec1 := dept_rec2;&nbsp; </p>
<p>但是，如果一个类型是引用的是数据表而另一个引用的是游标的话，那么，即使它们表现的内容相同，也是不能相互赋值的：</p>
<p>dept_rec2 := dept_rec3; -- not allowed&nbsp; </p>
<p>方法二：我们可以使用SELECT或FETCH语句将取得的数据赋给记录。但在表或视图中定义的字段名称顺序要与记录中的名称顺序相同。 </p>
<p>DECLARE <br />&nbsp; dept_rec dept%ROWTYPE ;<br />&nbsp; ...<br />BEGIN <br />&nbsp; SELECT&nbsp; * INTO&nbsp; dept_rec FROM&nbsp; dept WHERE&nbsp; deptno = 30;<br />&nbsp; ...<br />END ;&nbsp; </p>
<p>但是，我们不能使用赋值语句来把字段列表中的值赋给记录。所以，下面的语法形式是不允许的：</p>
<p>record_name := (value1, value2, value3, ...); -- not allowed&nbsp; </p>
<p>使用别名 <br />从游标中取出的数据，如果游标定义中含有表达式时，我们就需要使用别名才能正确地为%ROWTYPE类型记录赋值： </p>
<p>DECLARE <br />&nbsp; CURSOR&nbsp; my_cursor IS <br />&nbsp;&nbsp;&nbsp; SELECT&nbsp; sal + NVL(comm, 0) wages, ename FROM&nbsp; emp;<br />&nbsp; my_rec my_cursor%ROWTYPE ;<br />BEGIN <br />&nbsp; OPEN&nbsp; my_cursor;<br />&nbsp; LOOP <br />&nbsp;&nbsp;&nbsp; FETCH&nbsp; my_cursor INTO&nbsp; my_rec;<br />&nbsp;&nbsp;&nbsp; EXIT&nbsp; WHEN&nbsp; my_cursor%NOTFOUND;<br />&nbsp;&nbsp;&nbsp; IF&nbsp; my_rec.wages &gt; 2000 tdEN <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT&nbsp; INTO&nbsp; temp VALUES&nbsp; (NULL , my_rec.wages, my_rec.ename);<br />&nbsp;&nbsp;&nbsp; END&nbsp; IF ;<br />&nbsp; END&nbsp; LOOP ;<br />&nbsp; CLOSE&nbsp; my_cursor;<br />END ;&nbsp; </p>
<p>5、声明的约束</p>
<p>PL/SQL不允许向前引用。也就是说我们在使用变量或常量之前必须先声明。像下面这样的语句就是不合法的： </p>
<p>maxi&nbsp;&nbsp; INTEGER&nbsp; := 2 * mini;&nbsp;&nbsp; -- not allowed <br />mini&nbsp;&nbsp; INTEGER&nbsp; := 15;&nbsp; </p>
<p>但是，PL/SQL允许向前声明子程序。 </p>
<p>对于同样数据类型的每一个变量，都必须单独声明： </p>
<p>i&nbsp;&nbsp; SMALLINT ;<br />j&nbsp;&nbsp; SMALLINT ;<br />k&nbsp;&nbsp; SMALLINT ;&nbsp; </p>
<p>像下面这样的声明方式是不允许的： </p>
<p>i, j, k&nbsp;&nbsp; SMALLINT ;&nbsp;&nbsp; -- not allowed&nbsp; </p>
<p>四、PL/SQL命名规范</p>
<p>同样的命名规约适用于所有的PL/SQL程序，规约涉及的内容包括常量、变量、游标、异常、过程、函数和包。命名可能是简单的，加以限定的，远程的或是既加以限定又是远程的。例如，我们也许可能用到以下几种调用过程raise_salary的方式： </p>
<p>raise_salary(...);&nbsp;&nbsp; -- simple <br />emp_actions.raise_salary(...);&nbsp;&nbsp; -- qualified <br /><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#97;&#105;&#115;&#101;&#95;&#115;&#97;&#108;&#97;&#114;&#121;&#64;&#110;&#101;&#119;&#121;&#111;&#114;&#107;">raise_salary@newyork</a>(...);&nbsp;&nbsp; -- remote <br /><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#101;&#109;&#112;&#95;&#97;&#99;&#116;&#105;&#111;&#110;&#115;&#46;&#114;&#97;&#105;&#115;&#101;&#95;&#115;&#97;&#108;&#97;&#114;&#121;&#64;&#110;&#101;&#119;&#121;&#111;&#114;&#107;">emp_actions.raise_salary@newyork</a>(...);&nbsp;&nbsp; -- qualified and remote&nbsp; </p>
<p>第一种情况，我们只是简单的使用程序名称。第二种情况，我们必须使用点标志(dot notation)来引用过程，因为它是保存在emp_actions包中的。第三种情况，使用远程访问指示符，就能引用数据库连接newyork，因为过程是存放在远程数据库的。第四中情况，我们在过程名称加上限定修饰词并引用数据库连接。 </p>
<p>同义词 <br />我们可以创建同义词来隐藏远程模式对象的位置，其中包括表、视图、序列、存储函数、包、和对象类型。但是，我们不能为子程序或包中声明的内容创建同义词，其中包括常量、变量、游标变量、异常和打包子程序。 </p>
<p>作用域 <br />同一作用域内声明的标识符都必须是唯一的。所以，即使它们的数据类型不同，变量和参数也不能享用同一名称。下例中，第二个声明是不允许的：</p>
<p>valid_id&nbsp;&nbsp; BOOLEAN ;<br />valid_id&nbsp;&nbsp; VARCHAR2&nbsp; (5);&nbsp;&nbsp; -- not allowed duplicate identifier&nbsp; </p>
<p>大小写敏感 <br />像所有的标识符一样，常量、变量和参数的名称都是大小写不敏感的。例如，PL/SQL认为下面的名称都是相同的： </p>
<p>zip_code&nbsp;&nbsp; INTEGER ;<br />zip_code&nbsp;&nbsp; INTEGER ;&nbsp;&nbsp; -- same as zip_code&nbsp; </p>
<p>命名解析 <br />在SQL语句中，数据库字段名称的优先级要高于本地变量和形式参数。例如，下面的DELETE语句会从emp表删除所有的雇员信息，而不只是名字为"KING"的雇员： </p>
<p>DECLARE <br />&nbsp; ename&nbsp;&nbsp; VARCHAR2&nbsp; (10) := 'KING' ;<br />BEGIN <br />&nbsp; DELETE&nbsp; FROM&nbsp; emp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE&nbsp; ename = ename;<br />&nbsp; ...&nbsp; </p>
<p>在这种情况下，为了避免产生歧义，可以像下面这样在本地变量和形式参数的前面加上类似于"my_"这样的前缀：</p>
<p>DECLARE <br />&nbsp; my_ename VARCHAR2 (10);&nbsp; </p>
<p>或是使用块标签来进行引用限定： </p>
<p>&lt;&lt;main&gt;&gt;<br />DECLARE <br />&nbsp; ename&nbsp;&nbsp; VARCHAR2&nbsp; (10) := 'KING' ;<br />BEGIN <br />&nbsp; DELETE&nbsp; FROM&nbsp; emp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE&nbsp; ename = main.ename;<br />&nbsp; ...&nbsp; </p>
<p>下面的例子演示了如何使用子程序名称来限定对本地变量和形式参数的引用： </p>
<p>FUNCTION&nbsp; bonus (deptno IN&nbsp; NUMBER , ...) RETURN&nbsp; REAL&nbsp; IS <br />&nbsp; job CHAR (10);<br />BEGIN <br />&nbsp; SELECT&nbsp; ... WHERE&nbsp; deptno = bonus.deptno AND&nbsp; job = bonus.job;<br />&nbsp; ...&nbsp; </p>
<p>五、PL/SQL标识符的作用域(scope)和可见度(visiblity)</p>
<p>对标识符的引用可以通过它的作用域和可见度来进行解析。标识符的作用域就是我们引用标识符的程序单元区域(块，子程序或包)。一个标识符只在它的作用域内可见，我们可以在作用域内不使用限定词而直接引用它。下图演示了变量x的作用域和可见度。x首先被声明在封闭块中，然后又在子块中重新定义。 </p>
<p>&nbsp;<br />PL/SQL块中声明的标识符对于其所在块来说是本地的，对于子块来说是全局的。如果全局标识符在子块中被重新声明，那么，全局和本地声明的标识符在子块的作用域都是存在的，但是，只有本地标识符是可见的，这时如果想引用全局标识符，就需要添加限定修饰词。 </p>
<p>虽然我们不能在同一块中两次声明同一标识符，但可以在两个不同的块中声明同一标识符。这两个标识符是互相独立的，对其中任何一个的改变都不会影响到另一个。但是，一个块不能引用同一级别中另外一个块中的变量，因为对于它来说，同级块中标识符即不是本地的，又不是全局的。 </p>
<p>下面的例子演示了作用域规则： </p>
<p>DECLARE <br />&nbsp; a&nbsp;&nbsp; CHAR ;<br />&nbsp; b&nbsp;&nbsp; REAL ;<br />BEGIN <br />&nbsp; -- identifiers available here: a (CHAR), b <br />&nbsp; DECLARE <br />&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp; INTEGER ;<br />&nbsp;&nbsp;&nbsp; c&nbsp;&nbsp; REAL ;<br />&nbsp; BEGIN <br />&nbsp;&nbsp;&nbsp; -- identifiers available here: a (INTEGER), b, c <br />&nbsp; END ;</p>
<p>&nbsp; DECLARE <br />&nbsp;&nbsp;&nbsp; d&nbsp;&nbsp; REAL ;<br />&nbsp; BEGIN <br />&nbsp;&nbsp;&nbsp; -- identifiers available here: a (CHAR), b, d <br />&nbsp; END ;<br />&nbsp; -- identifiers available here: a (CHAR), b <br />END ;&nbsp; </p>
<p>如果子块中重新声明了全局标识符，本地标识符优先权高于全局标识符，我们就不能再引用全局标识符，除非使用限定名(qualified name)。修饰词可以是封闭块的标签，如下例所示： </p>
<p>&lt;&lt;outer&gt;&gt;<br />DECLARE <br />&nbsp; birtddate&nbsp;&nbsp; DATE ;<br />BEGIN <br />&nbsp; DECLARE <br />&nbsp;&nbsp;&nbsp; birtddate&nbsp;&nbsp; DATE ;<br />&nbsp; BEGIN <br />&nbsp;&nbsp; ...<br />&nbsp;&nbsp;&nbsp; IF&nbsp; birtddate = OUTER.birtddate tdEN <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />&nbsp;&nbsp;&nbsp; END&nbsp; IF ;<br />&nbsp;&nbsp;&nbsp; ...<br />&nbsp; END ;<br />&nbsp; ...<br />END ;&nbsp; </p>
<p>如下例所示，限定修饰词也可以是封闭子程序的名称： </p>
<p>PROCEDURE&nbsp; check_credit(...) IS <br />&nbsp; rating&nbsp;&nbsp; NUMBER ;</p>
<p>&nbsp; FUNCTION&nbsp; valid(...)<br />&nbsp;&nbsp;&nbsp; RETURN&nbsp; BOOLEAN&nbsp; IS <br />&nbsp;&nbsp;&nbsp; rating&nbsp;&nbsp; NUMBER ;<br />&nbsp; BEGIN <br />&nbsp;&nbsp;&nbsp; ...<br />&nbsp;&nbsp;&nbsp; IF&nbsp; check_credit.rating &lt; 3 tdEN&nbsp; ...<br />&nbsp; END ;<br />BEGIN <br />&nbsp; ...<br />END ;&nbsp; </p>
<p>但是，在同一作用域内，标签和子程序不能使用相同的命名。 </p>
<p>六、变量赋值</p>
<p>变量和常量都是在程序进入块或子程序的时候被初始化的。默认情况下，变量都是被初始化成NULL的。除非我们为变量指定一个值，否则结果是未知的。请看下面的例子： </p>
<p>DECLARE <br />&nbsp; count INTEGER ;<br />BEGIN <br />&nbsp; -- COUNT began witd a value of NULL . <br />&nbsp; -- tdus tde expression &#8217;COUNT + 1&#8217; is also null. <br />&nbsp; -- So after tdis assignment, COUNT is still NULL . <br />&nbsp; count := count + 1;&nbsp; </p>
<p>为了避免这样的情况，就要保证在赋值之前不要使用这个变量。 </p>
<p>我们可以使用表达式来为变量赋值，例如下面的语句为变量bonus赋值： </p>
<p>bonus := salary * 0.15;&nbsp; </p>
<p>这里，我们需要保证的是salary * 0.15计算结果的类型必须和bonus类型保持一致。 </p>
<p>1、布尔型(Boolean)赋值</p>
<p>只有TRUE、FALSE和NULL才可以赋给布尔类型的变量。例如： </p>
<p>BEGIN <br />&nbsp; done := FALSE ;<br />&nbsp; WHILE&nbsp; NOT&nbsp; done LOOP <br />&nbsp;&nbsp;&nbsp; ...<br />&nbsp; END&nbsp; LOOP ;&nbsp; </p>
<p>当表达式中使用关系操作符的时候，返回结果也是布尔类型的值，所以下面的语句也是允许的。 </p>
<p>done := (count &gt; 500);&nbsp; </p>
<p>2、利用SQL查询为PL/SQL变量赋值</p>
<p>我们可以使用SELECT语句让Oracle为变量赋值。对于查询字段中的每一项，在INTO子句的后面都必须有与之对应的类型兼容的变量。看一下下面这个例子：</p>
<p>DECLARE <br />&nbsp; emp_id&nbsp;&nbsp;&nbsp;&nbsp; emp.empno%TYPE ;<br />&nbsp; emp_name&nbsp;&nbsp; emp.ename%TYPE ;<br />&nbsp; wages&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER (7,2);<br />BEGIN <br />&nbsp; -- assign a value to emp_id here <br />&nbsp; SELECT&nbsp;&nbsp;&nbsp; ename, sal + comm INTO&nbsp; emp_name, wages<br />&nbsp;&nbsp;&nbsp; FROM&nbsp;&nbsp;&nbsp; emp<br />&nbsp;&nbsp; WHERE&nbsp;&nbsp;&nbsp; empno = emp_id;<br />&nbsp; ...<br />END ;&nbsp; </p>
<p>但是，上面的用法不可以为布尔类型变量赋值。 </p>
<p>七、PL/SQL表达式与比较</p>
<p>表达式由操作数和操作符构成。一个操作数就是一个变量、常量、文字或是能够返回一个值的函数。下面是一个简单的数学表达式： </p>
<p>-X / 2 + 3&nbsp; </p>
<p>像负号(-)这样的只作用于一个操作数的操作符称为一元操作符；而像除号(/)这样作用于两个操作数的操作符称为二元操作符。PL/SQL没有三元操作符。 </p>
<p>最简单的表达式就是一个能直接算出值的变量。PL/SQL按照指定的操作符和操作数来计算表达式的值，结果值的数据类型是由表达式所在的关联文决定的。</p>
<p>由于操作符的运算优先级不同，表达式的计算顺序也是不一样的。下表是默认的操作符优先级顺序。</p>
<p>操作符 运算 <br />** 求幂 <br />+, - 正，负 <br />*, / 乘，除 <br />+, -, || 加，减，连接 <br />=, &lt;, &gt;, &lt;=, &gt;=, &lt;&gt;, !=, ~=, ^=, <br />IS NULL, LIKE, BETWEEN, IN 比较 <br />NOT 逻辑非 <br />AND 与 <br />OR 或 </p>
<p>优先级高的操作符会比优先级低的操作符先求值。下例中，两个表达式都能计算出结果8来，因为除号的优先级要高于加号。优先级相同的操作符不会采取特殊的计算顺序。 </p>
<p>5 + 12 / 4</p>
<p>12 / 4 + 5&nbsp; </p>
<p>我们可以使用括号控制计算顺序。例如，下面的表达式值是7，而不是11，因为括号覆盖了默认的操作符优先顺序： </p>
<p>(8 + 6) / 2&nbsp; </p>
<p>再看一个例子。下面的运算中，减法会在除法之前被计算，这是因为最深层的表达式总是第一个被计算的： </p>
<p>100 + (20 / 5 + (7 - 3))&nbsp; </p>
<p>最后，我们看看如何使用括号来改善可读性，即使不是在必须使用括号的时候： </p>
<p>(salary * 0.05) + (commission * 0.25)&nbsp; </p>
<p>1、逻辑操作符</p>
<p>逻辑操作符有AND、OR和NOT，其中AND和OR是二元操作符，而NOT是一元操作符。下面是对应操作的真值表。 </p>
<p>x y x AND y x OR y NOT x <br />TRUE TRUE TRUE TRUE FALSE <br />TRUE FALSE FALSE TRUE FALSE <br />TRUE NULL NULL TRUE FALSE <br />FALSE TRUE FALSE TRUE TRUE <br />FALSE FALSE FALSE FALSE TRUE <br />FALSE NULL FALSE NULL TRUE <br />NULL TRUE NULL TRUE NULL <br />NULL FALSE FALSE NULL NULL <br />NULL NULL NULL NULL NULL </p>
<p>如上面的真值表所示，AND只在操作符两边的操作数都是真的情况才返回TRUE。另一方面，OR操作符两边的操作数只要有一个值为真就能返回TRUE。NOT会返回操作数相反的值。例如NOT TRUE返回FALSE。</p>
<p>这里需要注意的地方是，由于NULL是一个不确定的值，所以NOT NULL的值也是无法确定的。 </p>
<p>运算顺序 <br />当我们不用括号指定计算顺序的时候，操作符的优先级就会决定操作数的计算顺序。比较下面两个表达式： </p>
<p>NOT&nbsp; (valid AND&nbsp; done)&nbsp; NOT&nbsp; valid AND&nbsp; done&nbsp; </p>
<p>如果布尔变量valid和done的值都是FALSE，那么第一个表达式的结果就为TRUE。但是，第二个表达式的结果却是FALSE，因为NOT的优先级要比AND高。因此，第二个表达式就等价于：</p>
<p>(NOT&nbsp; valid) AND&nbsp; done&nbsp; </p>
<p>在下面的例子中，当valid的值为FALSE，不论done值是多少，整个表达式的值总为FALSE： </p>
<p>valid AND&nbsp; done&nbsp; </p>
<p>同样，当下例中的valid的值为TRUE时，不论done值是多少，整个表达式的值总为TRUE： </p>
<p>valid OR&nbsp; done&nbsp; </p>
<p>短路计算 <br />在计算逻辑表达式时，PL/SQL使用的是短路计算方法。也就是说，PL/SQL在结果可以确定下来的时候，就不会再继续计算表达式的值了。看一下下面这个例子：</p>
<p>DECLARE <br />&nbsp; ...<br />&nbsp; on_hand&nbsp;&nbsp;&nbsp; INTEGER ;<br />&nbsp; on_order&nbsp;&nbsp; INTEGER ;<br />BEGIN <br />&nbsp; ...<br />&nbsp; IF&nbsp; (on_hand = 0) OR&nbsp; ((on_order / on_hand) &lt; 5) tdEN <br />&nbsp;&nbsp;&nbsp; ...<br />&nbsp; END&nbsp; IF ;<br />END ;&nbsp; </p>
<p>当on_hand的值是零的时候，操作符OR左面的操作数结果为TRUE，所以PL/SQL就不需要计算右边的值了。如果PL/SQL是在应用OR操作符之前计算两个操作数的值的话，那么右边的操作数就会产生一个除零的错误。不管怎样，依赖于"短路"计算不是一个好习惯。</p>
<p>比较操作符 <br />比较操作符用于将一个表达式与另一个表达式进行比较。结果是TRUE或FALSE或NULL。最常见的就是我们在条件控制语句和SQL数据操作语句中的WHERE子句中使用比较操作符。例如： </p>
<p>IF&nbsp; quantity_on_hand &gt; 0 tdEN <br />&nbsp; UPDATE&nbsp; inventory<br />&nbsp;&nbsp;&nbsp;&nbsp; SET&nbsp; quantity = quantity - 1<br />&nbsp;&nbsp; WHERE&nbsp; part_number = item_number;<br />ELSE <br />&nbsp; ...<br />END&nbsp; IF ;&nbsp; </p>
<p>关系操作符 <br />关系操作符可以让我们随意比较复杂的表达式。下面的表格列出了各种关系操作符的含义。 </p>
<p>操作符 含义 <br />=&nbsp; 等于 <br />&lt;&gt;, !=, ~=, ^=&nbsp; 不等于 <br />&lt;&nbsp; 小于 <br />&gt;&nbsp; 大于 <br />&lt;=&nbsp; 小于等于 <br />&gt;=&nbsp; 大于等于 </p>
<p>IS NULL 操作符 <br />如果IS NULL所作用的操作数为空，则返回结果TRUE，否则返回结果FALSE。与空值作比较，结果总是空。所以，无论什么时候跟空值作比较，都要使用IS NULL操作符： </p>
<p>IF&nbsp; variable IS&nbsp; NULL&nbsp; tdEN&nbsp; ...&nbsp; </p>
<p>LIKE操作符 <br />我们可以使用LIKE操作符来判断一个字符、字符串或CLOB类型的值是不是与我们指定的样式相匹配。如果样式匹配，LIKE就会返回TRUE，否则返回FALSE。用于LIKE匹配的样式中，包含两种通配符。下划线(_)：精确匹配一个字符；百分号(%)：匹配零个或多个字符。如下面的例子中，如果ename的值是"JOHNSON"，那么表达式结果就为TRUE：</p>
<p>ename LIKE&nbsp; 'J%SON'&nbsp; </p>
<p>BETWEEN操作符 <br />BETWEEN操作符用于判断目标值是否在指定的目标范围内。例如，下面表达式的结果就为FALSE： </p>
<p>45 BETWEEN&nbsp; 38 AND&nbsp; 44&nbsp; </p>
<p>IN操作符 <br />IN操作符是用于测试目标值是否是集合成员之一。其中，集合是可以包含NULL值的，但它们是被忽略的。例如，下面这个语句并不会删除ename值为NULL的行： </p>
<p>DELETE&nbsp; FROM&nbsp; emp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE&nbsp; ename IN&nbsp; (NULL , 'KING' , 'FORD' );&nbsp; </p>
<p>此外，如果集合中包含了NULL值，下面表达式的运算结果就是FALSE。</p>
<p>value NOT&nbsp; IN&nbsp; set&nbsp; </p>
<p>所以，下面这个表达式也不会删除任何行： </p>
<p>DELETE&nbsp; FROM&nbsp; emp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE&nbsp; ename NOT&nbsp; IN&nbsp; (NULL , 'king' );&nbsp; </p>
<p>连接操作符 <br />双竖线(||)可以当作字符连接操作符，可以将两个字符串(CHAR、VARCHAR2、CLOB或等价的Unicode支持的类型)连接起来。例如表达式</p>
<p>'suit'&nbsp; || 'case'&nbsp; </p>
<p>返回的结果就是</p>
<p>'suitcase'&nbsp; </p>
<p>如果操作符两边的操作数都是CHAR类型，连接操作符返回的结果就是CHAR值。如果其中一个是CLOB值，操作符就返回临时CLOB。其余情况均返回VARCHAR2类型。</p>
<p>2、布尔表达式</p>
<p>PL/SQL允许我们在SQL语句和过程语句中比较变量和常量。这样的比较称为布尔表达式，它们是由用关系操作符分割开的简单或复杂表达式组成。通常，布尔表达式是由逻辑操作符AND、OR或NOT连接。布尔表达式的运算结果总是TRUE、FALSE或NULL。 </p>
<p>在SQL语句中，布尔表达式能让我们指定一个表中哪些行记录可以被影响。在过程语句中，布尔表达式是条件控制的基础。其中有三种布尔表达式：算术、字符和日期。 </p>
<p>布尔算术表达式 <br />我们可以使用关系表达式来比较两个数字等或不等。例如，下面的表达式结果就为真：</p>
<p>number1&nbsp;&nbsp;&nbsp; := 75;<br />number2&nbsp;&nbsp;&nbsp; := 70;</p>
<p>number1 &gt; number2&nbsp;&nbsp; -- TRUE&nbsp; </p>
<p>布尔字符表达式 <br />我们也可以比较字符的等或不等。默认情况下，比较都是基于字符串中每个字节的二进制值的。比如，下面例子中的表达式结果就为真：</p>
<p>string1&nbsp;&nbsp;&nbsp; := 'Katdy' ;<br />string2&nbsp;&nbsp;&nbsp; := 'Katdleen' ;</p>
<p>string1 &gt; string2&nbsp;&nbsp; -- TRUE&nbsp; </p>
<p>设置初始化参数NLS_COMP=ANSI，就能使用初始化参数NLS_SORT指定的整理序列(collating sequence)来进行比较。整理序列是一个字符集中表现字符的数字代码(numeric code)的内部顺序，如果一个字符的数字代码比另一个大，那这个字符就比另一个字符大。关于字符在整理序列中出现的位置，每种语言都可能有不同的定义规则。比如说，重音字母可能会因数据库的字符集的不同而排序不同，即使每一种情况下的二进制值都相同。</p>
<p>布尔日期表达式 <br />对于日期类型的比较，是按照年代的顺序的。如下例，date1的值是大于date2的值的。 </p>
<p>date1&nbsp;&nbsp;&nbsp; := '01-JAN-91' ;<br />date2&nbsp;&nbsp;&nbsp; := '31-DEC-90' ;</p>
<p>date1 &gt; date2&nbsp;&nbsp; -- TRUE&nbsp; </p>
<p>关于PL/SQL的布尔表达式使用的一些建议 <br />一般地，不要把实型数字用于精确比较。实型数字一般都是按近似值存储的。所以，下面的表式式值并不等于TRUE： </p>
<p>COUNT&nbsp;&nbsp;&nbsp; := 1;</p>
<p>IF&nbsp; COUNT = 1.0 tdEN <br />&nbsp; ...<br />END&nbsp; IF ;&nbsp; </p>
<p>在作比较时使用括号是一个好习惯。例如，下面的这样的表达式形式是不允许的，因为 100 &lt; tax 的结果是布尔型，而布尔型是不能和数字500进行比较的。</p>
<p>100 &lt; tax &lt; 500&nbsp;&nbsp; -- not allowed&nbsp; </p>
<p>解决方法是使用下面这样的表达式： </p>
<p>(100 &lt; tax) AND&nbsp; (tax &lt; 500)&nbsp; </p>
<p>对于布尔型的变量来说，它的值要么为TRUE要么为FALSE，因此，对布尔型变量应用比较操作是多余的。对于下面的内容：</p>
<p>WHILE&nbsp; NOT (done = TRUE ) LOOP <br />&nbsp; ...<br />END&nbsp; LOOP ;&nbsp; </p>
<p>可以简化为：</p>
<p>WHILE&nbsp; NOT&nbsp; done LOOP <br />&nbsp; ...<br />END&nbsp; LOOP ;&nbsp; </p>
<p>对COLB类型应用比较操作符或是用LIKE和BETWEEN这样的函数时，可能会产生临时LOB。我们就得确保有足够大的表空间来容纳这些临时LOB。 </p>
<p>3、CASE表达式</p>
<p>一个CASE表达式从一个或多个供选方案中选择一个返回结果。CASE表达式使用一个选择器来决定返回哪一个分支的结果。具体的语法形式如下： </p>
<p>CASE&nbsp; selector<br />&nbsp; WHEN&nbsp; expression1 tdEN&nbsp; result1<br />&nbsp; WHEN&nbsp; expression2 tdEN&nbsp; result2<br />&nbsp; ...<br />&nbsp; WHEN&nbsp; expressionn tdEN&nbsp; resultn<br />&nbsp; [ELSE&nbsp; resultN+1]<br />END ;&nbsp; </p>
<p>选择器后面跟着一个或多个WHEN子句，它们会被依次验证的。一旦有一个WHEN子句满足条件的话，剩下的分支条件就不再执行了。例如：</p>
<p>DECLARE <br />&nbsp; grade&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR (1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := 'B' ;<br />&nbsp; appraisal&nbsp;&nbsp; VARCHAR2 (20);<br />BEGIN <br />&nbsp; appraisal&nbsp;&nbsp;&nbsp; := CASE&nbsp; grade<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 'A'&nbsp; tdEN&nbsp; 'Excellent' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 'B'&nbsp; tdEN&nbsp; 'Very Good' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 'C'&nbsp; tdEN&nbsp; 'Good' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 'D'&nbsp; tdEN&nbsp; 'Fair' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; 'F'&nbsp; tdEN&nbsp; 'Poor' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE&nbsp; 'No such grade' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END ;<br />END ;&nbsp; </p>
<p>其中，ELSE子句是可选的，工作方式同IF语句中的ELSE子句相似。如果我们不提供ELSE子句，并且选择器没有匹配任何WHEN子句，表达式的返回的结果就是NULL。</p>
<p>这种形式的CASE表达式的另外一种使用方法就是CASE语句，其中每个WHEN子句都可以是一个完整的PL/SQL块。 </p>
<p>搜索式CASE表达式 <br />PL/SQL也提供了搜索式的CASE表达式，它的语法形式如下： </p>
<p>CASE <br />&nbsp; WHEN&nbsp; expression1 tdEN&nbsp; result1<br />&nbsp; WHEN&nbsp; expression2 tdEN&nbsp; result2<br />&nbsp; ...<br />&nbsp; WHEN&nbsp; expressionn tdEN&nbsp; resultn<br />&nbsp; [ELSE&nbsp; resultN+1]<br />END ;&nbsp; </p>
<p>搜索式CASE表达式没有选择器。每个WHEN子句包含一个能返回布尔值的搜索条件。例子如下： </p>
<p>DECLARE <br />&nbsp; grade&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR (1);<br />&nbsp; appraisal&nbsp;&nbsp; VARCHAR2 (20);<br />BEGIN <br />&nbsp; ...<br />&nbsp; appraisal&nbsp;&nbsp;&nbsp; := CASE <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; grade = 'A'&nbsp; tdEN&nbsp; 'Excellent' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; grade = 'B'&nbsp; tdEN&nbsp; 'Very Good' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; grade = 'C'&nbsp; tdEN&nbsp; 'Good' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; grade = 'D'&nbsp; tdEN&nbsp; 'Fair' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN&nbsp; grade = 'F'&nbsp; tdEN&nbsp; 'Poor' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE&nbsp; 'No such grade' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END ;<br />&nbsp; ...<br />END ;&nbsp; </p>
<p>搜索条件按顺序计算。搜索条件的布尔值决定了哪个WHEN子句被执行。如果搜索条件的值为TRUE，它对应的WHEN子句就会被执行。只要其中一个 WHEN子句被执行，后续的搜索条件就不会被计算了。如果没有匹配的条件，可选的ELSE就会被执行。如果没有匹配的WHEN子句，也没有ELSE子句，表达式的结果就为NULL。 </p>
<p>4、在比较和条件语句中处理NULL值</p>
<p>在使用NULL值时，我们一定要记住下面几条规则，避免发生一些常见的错误： </p>
<p>比较中如果有空值的话，那么计算结果总为NULL <br />对空值应用逻辑操作符NOT，结果还是NULL <br />条件控制语句中，如果条件的运算结果值为NULL的话，与之相关的语句就不会被执行 <br />简单CASE语句中对于空值的判断要使用WHEN expression IS NULL <br />下例中，我们期待的是sequence_of_statements被执行，因为x和y看起来就是不等的。但是，由于NULL是不确定的值，那么，x是否等于y也就无法确定了。所以，sequence_of_statements并不会执行。 </p>
<p>x&nbsp;&nbsp;&nbsp; := 5;<br />y&nbsp;&nbsp;&nbsp; := NULL ;<br />...<br />IF&nbsp; x != y tdEN&nbsp;&nbsp;&nbsp; -- yields NULL, not TRUE <br />&nbsp; sequence_of_statements; -- not executed <br />END&nbsp; IF ;&nbsp; </p>
<p>同样，下例中的sequence_of_statements也不会被执行： </p>
<p>a&nbsp;&nbsp;&nbsp; := NULL ;<br />b&nbsp;&nbsp;&nbsp; := NULL ;<br />...<br />IF&nbsp; a = b tdEN&nbsp;&nbsp;&nbsp; -- yields NULL, not TRUE <br />&nbsp; sequence_of_statements; -- not executed <br />END&nbsp; IF ;&nbsp; </p>
<p>NOT操作符 <br />让我们再回忆一下逻辑操作符NOT，当对一个NULL值应用NOT时，结果总是NULL。因此，下面两段内容并不相同。 </p>
<p>IF&nbsp; x &gt; y tdEN <br />&nbsp; high&nbsp;&nbsp;&nbsp; := x;<br />ELSE <br />&nbsp; high&nbsp;&nbsp;&nbsp; := y;<br />END&nbsp; IF ;&nbsp; IF&nbsp; NOT&nbsp; x &gt; y tdEN <br />&nbsp; high&nbsp;&nbsp;&nbsp; := y;<br />ELSE <br />&nbsp; high&nbsp;&nbsp;&nbsp; := x;<br />END&nbsp; IF ;&nbsp; </p>
<p>当IF条件值为FALSE或NULL时，ELSE部分就会被执行。如果x和y都不为NULL的话，两段程序运行的效果是一样的。但是，如果IF条件为NULL的话，第一段是给y赋值，而第二段是给x赋值。 </p>
<p>零长度字符串 <br />PL/SQL把零长度字符串当作空值处理，这其中包括由字符函数和布尔表达式返回的值。下面的语句均是给目标变量赋空值的操作：</p>
<p>null_string&nbsp;&nbsp;&nbsp; := TO_CHAR('');<br />zip_code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := SUBSTR(address, 25, 0);<br />valid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :=(NAME != '');&nbsp; </p>
<p>所以，对于检测空字符串，要使用IS NULL操作符： </p>
<p>IF&nbsp; my_string IS&nbsp; NULL&nbsp; tdEN&nbsp; ...&nbsp; </p>
<p>连接操作符 <br />连接操作符会忽略空值，例如表达式</p>
<p>'apple'&nbsp; || NULL&nbsp; || NULL&nbsp; || 'sauce'&nbsp; </p>
<p>会返回 </p>
<p>'applesauce'&nbsp; </p>
<p>函数 <br />如果给内置函数传递空值，一般也都会返回空值，但以下几种情况除外。</p>
<p>函数DECODE将它的第一个参数和后面的一个或多个表达式相比较(表达式的值有可能为空)，如果比较的内容相匹配，就会返回后面的结果表达式。例如在下面的例子中，如果字段rating的值为空，DECODE就会返回1000：</p>
<p>SELECT&nbsp; DECODE(rating,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL , 1000,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'C' , 2000,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'B' , 4000,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'A' , 5000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />&nbsp; INTO&nbsp; credit_limit<br />&nbsp; FROM&nbsp; accts<br />&nbsp;WHERE&nbsp; acctno = my_acctno;&nbsp; </p>
<p>函数NVL在判断出第一个参数是空的情况下，会返回第二个参数的值，否则直接返回第一个参数的值。使用方法如下： </p>
<p>start_date := NVL(hire_date, SYSDATE );&nbsp; </p>
<p>函数REPLACE第二个参数是NULL的时候，它就会返回第一个参数的值，不管是否有第三个参数。例如，在下面例子中，结果字符串new_string的值和old_string的值完全一样。 </p>
<p>new_string := REPLACE(old_string, NULL , my_string);&nbsp; </p>
<p>如果第三个参数为空的话，REPLACE就会把第一个参数中出现的第二个参数删除，然后返回结果。如下面这个例子：</p>
<p>&nbsp; syllabified_name&nbsp;&nbsp;&nbsp; := 'gold - i - locks' ;<br />&nbsp; NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := REPLACE(syllabified_name,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' - ' ,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );&nbsp; </p>
<p>运算的结果字符串是"goldilocks"。如果第二个和第三个参数都是NULL值，REPLACE就直接返回第一个参数。 </p>
<p>八、内置函数</p>
<p>PL/SQL为我们提供了许多功能强大的数据操作函数。这些函数可以分为以下几类： </p>
<p>错误报告 <br />数字 <br />字符 <br />类型转换 <br />日期 <br />对象引用 <br />杂项 <br />下面的表格是各个分类的函数。</p>
<p>错误&nbsp; 数字&nbsp; 字符&nbsp; 转换&nbsp; 日期&nbsp; 对象引用&nbsp; 杂项 <br />SQLCODE ABS ASCII CHARTOROWID ADD_MONtdS DEREF BFILENAME <br />SQLERRM ACOS CHR CONVERT CURRENT_DATE REF DECODE <br />&nbsp; ASIN CONCAT HEXTORAW CURRENT_TIMESTAMP VALUE DUMP <br />&nbsp; ATAN INITCAP RAWTOHEX DBTIMEZONE TREAT EMPTY_BLOB <br />&nbsp; ATAN2 INSTR ROWIDTOCHAR EXTRACT&nbsp;&nbsp; EMPTY_CLOB <br />&nbsp; BITAND INSTRB TO_BLOB FROM_TZ&nbsp;&nbsp; GREATEST <br />&nbsp; CEIL LENGtd TO_CHAR LAST_DAY&nbsp;&nbsp; LEAST <br />&nbsp; COS LENGtdB TO_CLOB LOCALTIMESTAMP&nbsp;&nbsp; NLS_CHARSET_DECL_LEN <br />&nbsp; COSH LOWER TO_DATE MONtdS_BETWEEN&nbsp;&nbsp; NLS_CHARSET_ID <br />&nbsp; EXP LPAD TO_MULTI_BYTE NEW_TIME&nbsp;&nbsp; NLS_CHARSET_NAME <br />&nbsp; FLOOR LTRIM TO_NCLOB NEXT_DAY&nbsp;&nbsp; NVL <br />&nbsp; LN NLS_INITCAP TO_NUMBER NUMTODSINTERVAL&nbsp;&nbsp; SYS_CONTEXT <br />&nbsp; LOG NLS_LOWER TO_SINGLE_BYTE NUMTOYMINTERVAL&nbsp;&nbsp; SYS_GUID <br />&nbsp; MOD NLSSORT&nbsp;&nbsp; ROUND&nbsp;&nbsp; UID <br />&nbsp; POWER NLS_UPPER&nbsp;&nbsp; SESSIONTIMEZONE&nbsp;&nbsp; USER <br />&nbsp; ROUND REPLACE&nbsp;&nbsp; SYSDATE&nbsp;&nbsp; USERENV <br />&nbsp; SIGN RPAD&nbsp;&nbsp; SYSTIMESTAMP&nbsp;&nbsp; VSIZE <br />&nbsp; SIN RTRIM&nbsp;&nbsp; TO_DSINTERVAL&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; SINH SOUNDEX&nbsp;&nbsp; TO_TIMESTAMP&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; SQRT SUBSTR&nbsp;&nbsp; TO_TIMESTAMP_LTZ&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; TAN SUBSTRB&nbsp;&nbsp; TO_TIMESTAMP_TZ&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; TANH TRANSLATE&nbsp;&nbsp; TO_YMINTERVAL&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; TRUNC TRIM&nbsp;&nbsp; TZ_OFFSET&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; UPPER&nbsp;&nbsp; TRUNC&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>除了错误报告(error-reporting)函数SQLCODE和SQLERRM之外，我们可以在SQL语句中使用上面所有的函数。同样，<a href="http://www.tbwshc.com"><span style="color: #000000">tbw淘宝商城</span></a>我们可以在过程表达式中使用除了对象引用函数DEFREF、REF、VALUE和杂函数(miscellaneous function)DECODE、DUMP、VSIZE之外的所有函数。 </p>
<p>虽然SQL聚合函数(aggregate function，如AVG和COUNT)和SQL解析函数(analytic function，如CORR和LAG)没有组合到PL/SQL中，但我们仍可以在SQL语句中使用它们(但不能在过程语句中使用)。</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/tbwshc/aggbug/379730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-06-01 12:07 <a href="http://www.blogjava.net/tbwshc/articles/379730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle中decode函数</title><link>http://www.blogjava.net/tbwshc/articles/379637.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Thu, 31 May 2012 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/articles/379637.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/379637.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/articles/379637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/379637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/379637.html</trackback:ping><description><![CDATA[<p><strong><span style="font-size: 9pt; font-family: Arial">1.oracle</span></strong><strong><span style="font-size: 9pt; font-family: 宋体">中</span></strong><strong><span style="font-size: 9pt; font-family: Arial">decode</span></strong><strong><span style="font-size: 9pt; font-family: 宋体">函数</span></strong><strong><span style="font-size: 9pt; font-family: Arial"></span></strong></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: Arial">DECODE</span><span style="font-size: 9pt; font-family: 宋体">函数相当于一条件语句</span><span style="font-size: 9pt; font-family: Arial">(IF).</span><span style="font-size: 9pt; font-family: 宋体">它将输入数值与函数中的参数列表相比较，根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然，如果未能与任何一个实参序偶匹配成功，则函数也有默认的返回值。区别于</span><span style="font-size: 9pt; font-family: Arial">SQL</span><span style="font-size: 9pt; font-family: 宋体">的其它函数，</span><span style="font-size: 9pt; font-family: Arial">DECODE</span><span style="font-size: 9pt; font-family: 宋体">函数还能识别和操作空值</span><span style="font-size: 9pt; font-family: Arial">. <br /></span><span style="font-size: 9pt; font-family: 宋体">其具体的语法格式如下：</span><span style="font-size: 9pt; font-family: Arial"> <br />DECODE(input_value,value,result[,value,result&#8230;][,default_result]); <br /></span><span style="font-size: 9pt; font-family: 宋体">其中：</span><span style="font-size: 9pt; font-family: Arial"> <br />input_value </span><span style="font-size: 9pt; font-family: 宋体">试图处理的数值。</span><span style="font-size: 9pt; font-family: Arial">DECODE</span><span style="font-size: 9pt; font-family: 宋体">函数将该数值与一系列的序偶相比较，以决定最后的返回结果</span><span style="font-size: 9pt; font-family: Arial"> <br />value </span><span style="font-size: 9pt; font-family: 宋体">是一组成序偶的数值。如果输入数值与之匹配成功，则相应的结果将被返回。对应一个空的返回值，可以使用关键字</span><span style="font-size: 9pt; font-family: Arial">NULL</span><span style="font-size: 9pt; font-family: 宋体">于之对应</span><span style="font-size: 9pt; font-family: Arial"> <br />result </span><span style="font-size: 9pt; font-family: 宋体">是一组成序偶的结果值</span><span style="font-size: 9pt; font-family: Arial"> <br />default_result </span><span style="font-size: 9pt; font-family: 宋体">未能与任何一序偶匹配成功时，函数返回的默认值</span><span style="font-size: 9pt; font-family: Arial"> <br /></span><span style="font-size: 9pt; font-family: 宋体">下面的例子说明了，如何读取用户</span><span style="font-size: 9pt; font-family: Arial">CHECKUP</span><span style="font-size: 9pt; font-family: 宋体">表</span><span style="font-size: 9pt; font-family: Arial">SEAPARK</span><span style="font-size: 9pt; font-family: 宋体">中的</span><span style="font-size: 9pt; font-family: Arial">BLOOD_TEST_FLAG</span><span style="font-size: 9pt; font-family: 宋体">列下的项目，作为</span><span style="font-size: 9pt; font-family: Arial">DECODE</span><span style="font-size: 9pt; font-family: 宋体">函数的实参支持值。</span><span style="font-size: 9pt; font-family: Arial"> <br />SELECT checkup_type, <br />DECODE(blood_test_flag,&#8217;Y&#8217;,&#8217;Yes&#8217;,&#8217;N&#8217;,&#8217;No&#8217;,NULL,&#8217;None&#8217;,&#8217;Invalid&#8217;) <br />FROM checkup;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>2.oracle</strong><strong><span style="font-family: 宋体">中</span>to char</strong><strong><span style="font-family: 宋体">和</span>to date</strong><strong><span style="font-family: 宋体">的区别</span></strong></p>
<p>&nbsp;</p>
<p>o char <span style="font-family: 宋体">是把日期或数字转换为字符串</span> <br />to date <span style="font-family: 宋体">是把字符串转换为数据库中得日期类型</span> <br />&nbsp;<span style="font-family: 宋体">转换函数</span><span style="font-family: Symbol">&#216;</span> <br />&nbsp;TO_CHAR<span style="font-family: Symbol">&#178;</span> <br /><span style="font-family: 宋体">使用</span>TO_CHAR<span style="font-family: 宋体">函数处理数字</span> <br />TO_CHAR(number, '<span style="font-family: 宋体">格式</span>') <br />TO_CHAR(salary,&#8217;$99,999.99&#8217;); <br /><span style="font-family: 宋体">使用</span>TO_CHAR<span style="font-family: 宋体">函数处理日期</span> <br />TO_CHAR(date,&#8217;<span style="font-family: 宋体">格式</span>&#8217;); <br />&nbsp;TO_NUMBER<span style="font-family: Symbol">&#178;</span> <br /><span style="font-family: 宋体">使用</span>TO_NUMBER<span style="font-family: 宋体">函数将字符转换为数字</span> <br />TO_NUMBER(char[, '<span style="font-family: 宋体">格式</span>']) <br />&nbsp;TO_DATE<span style="font-family: Symbol">&#178;</span> <br /><span style="font-family: 宋体">使用</span>TO_DATE<span style="font-family: 宋体">函数将字符转换为日期</span> <br />TO_DATE(char[, '<span style="font-family: 宋体">格式</span>']) <br /><br />&nbsp;<span style="font-family: 宋体">数字格式格式</span><span style="font-family: Symbol">&#178;</span> <br />9 <span style="font-family: 宋体">代表一个数字</span> <br />0 <span style="font-family: 宋体">强制显示</span>0 <br />$ <span style="font-family: 宋体">放置一个</span>$<span style="font-family: 宋体">符</span> <br />L <span style="font-family: 宋体">放置一个浮动本地货币符</span> <br />. <span style="font-family: 宋体">显示小数点</span> <br />, <span style="font-family: 宋体">显示千位指示符</span> <br /><br /><span style="font-family: Symbol">&#178;</span> <span style="font-family: 宋体">日期格式</span> <br /><span style="font-family: 宋体">格式控制</span> <span style="font-family: 宋体">描述</span> <br />YYYY<span style="font-family: 宋体">、</span>YYY<span style="font-family: 宋体">、</span>YY <span style="font-family: 宋体">分别代表</span>4<span style="font-family: 宋体">位、</span>3<span style="font-family: 宋体">位、</span>2<span style="font-family: 宋体">位的数字年</span> <br />YEAR <span style="font-family: 宋体">年的拼写</span> <br />MM <span style="font-family: 宋体">数字月</span> <br />MONTH <span style="font-family: 宋体">月的全拼</span> <br />MON <span style="font-family: 宋体">月的缩写</span> <br />DD <span style="font-family: 宋体">数字日</span> <br />DAY <span style="font-family: 宋体">星期的全拼</span> <br />DY <span style="font-family: 宋体">星期的缩写</span> <br />AM <span style="font-family: 宋体">表示上午或者下午</span> <br />HH24<span style="font-family: 宋体">、</span>HH12 12<span style="font-family: 宋体">小时制或</span>24<span style="font-family: 宋体">小时制</span> <br />MI <span style="font-family: 宋体">分钟</span> <br />SS <span style="font-family: 宋体">秒钟</span> <br />SP <span style="font-family: 宋体">数字的拼写</span> <br />TH <span style="font-family: 宋体">数字的序数词</span> <br />&#8220;<span style="font-family: 宋体">特殊字符</span>&#8221; <span style="font-family: 宋体">假如特殊字符</span> <br />HH24:MI:SS AM 15:43:20 PM <br />DD &#8220;OF&#8221; MONTH 12 OF OCTOBER <br />DDSPTH fourteenth <br />Date<span style="font-family: 宋体">的格式</span> &#8217;18-5<span style="font-family: 宋体">月</span>-84&#8217;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong></strong>&nbsp;</p>
<p><strong>3 NVL() 函数</strong><br /></p>
<p style="text-justify: inter-ideograph">&nbsp;从两个表达式返回一个非 null 值。<br /><br /><strong><span style="font-family: 宋体">语法</span></strong><br /><br /><strong><span style="background: #a0ffff; color: black; font-family: 宋体">NVL</strong>(eExpression1, eExpression2)<br /><br /></span><strong><span style="font-family: 宋体">参数</span></strong><br />eExpression1, eExpression2<br /><br />如果 eExpression1 的计算结果为 null 值，则 <strong><span style="background: #a0ffff; color: black; font-family: 宋体">NVL</span></strong>( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值，则返回 eExpression1。eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值，则 <strong><span style="background: #a0ffff; color: black; font-family: 宋体">NVL</span></strong>( ) 返回 .NULL.。<br /><br /><strong><span style="font-family: 宋体">返回值类型</span></strong><br /><br />字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null 值<br /><br /><strong><span style="font-family: 宋体">说明<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a><br /></span></strong><br />在不支持 null 值或 null 值无关紧要的情况下，可以使用 <strong><span style="background: #a0ffff; color: black; font-family: 宋体">NVL</span></strong>( ) 来移去计算或操作中的 null 值。</p>
<p style="text-justify: inter-ideograph">select <strong><span style="background: #a0ffff; color: black; font-family: 宋体">nvl</strong>(a.name,'</span>空得') as name from student a join school b on a.ID=b.ID</p>
<p><span style="font-family: 宋体">注意：两个参数得类型要匹配</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/tbwshc/aggbug/379637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-05-31 10:24 <a href="http://www.blogjava.net/tbwshc/articles/379637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chr码值对应列表大全</title><link>http://www.blogjava.net/tbwshc/articles/379636.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Thu, 31 May 2012 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/articles/379636.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/379636.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/articles/379636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/379636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/379636.html</trackback:ping><description><![CDATA[chr码值<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a>对应列表大全<br />Chr("0") 　为0的字符<br />Chr("1") 　<br />Chr("2") 　<br />Chr("3") 　<br />Chr("4") 　<br />Chr("5") 　<br />Chr("6") 　<br />Chr("7") 　响铃<br />Chr("8") 　回格<br />Chr("9") 　tab(水平制表符)<br />Chr("10") 　换行<br />Chr("11") 　tab(垂直制表符)<br />Chr("12") 　换页<br />Chr("13") 　回车&nbsp;&nbsp;&nbsp; chr(13)&amp;chr(10)&nbsp;&nbsp; 回车和换行的组合<br />Chr("14") 　<br />Chr("15") 　<br />Chr("16") 　<br />Chr("17") 　<br />Chr("18") 　<br />Chr("19") 　<br />Chr("20") 　<br />Chr("21") 　<br />Chr("22") 　<br />Chr("23") 　<br />Chr("24") 　<br />Chr("25") 　<br />Chr("26") 　结束&nbsp;&nbsp; End<br />Chr("27") 　脱离&nbsp;&nbsp; Pause break<br />Chr("28") 　<br />Chr("29") 　<br />Chr("30") 　<br />Chr("31") 　<br />Chr("32") 　空格 SPACE<br />Chr("33") 　!<br />Chr("34") 　"<br />Chr("35") 　#<br />Chr("36") 　$<br />Chr("37") 　%<br />Chr("38") 　&amp;<br />Chr("39") 　&#8217;<br />Chr("40") 　(<br />Chr("41") 　)<br />Chr("42") 　*　　　<br />Chr("43") 　+<br />Chr("44") 　,<br />Chr("45") 　- <br />Chr("46") 　.<br />Chr("47") 　/<br />Chr("48") 　0 <br />Chr("49") 　1<br />Chr("50") 　2<br />Chr("51") 　3<br />Chr("52") 　4　　　<br />Chr("53") 　5<br />Chr("54") 　6<br />Chr("55") 　7<br />Chr("56") 　8<br />Chr("57") 　9　　　<br />Chr("58") 　:<br />Chr("59") 　;<br />Chr("60") 　&lt;<br />Chr("61") 　=<br />Chr("62") 　&gt;　　　<br />Chr("63") 　?<br />Chr("64") 　@<br />Chr("65") 　A <br />Chr("66") 　B<br />Chr("67") 　C　　　<br />Chr("68") 　D<br />Chr("69") 　E<br />Chr("70") 　F<br />Chr("71") 　G<br />Chr("72") 　H　　　<br />Chr("73") 　I<br />Chr("74") 　J<br />Chr("75") 　K<br />Chr("76") 　L<br />Chr("77") 　M　　　<br />Chr("78") 　N<br />Chr("79") 　O<br />Chr("80") 　P<br />Chr("81") 　Q<br />Chr("82") 　R　　　<br />Chr("83") 　S<br />Chr("84") 　T<br />Chr("85") 　U<br />Chr("86") 　V<br />Chr("87") 　W　　　<br />Chr("88") 　X<br />Chr("89") 　Y<br />Chr("90") 　Z <br />Chr("91") 　[<br />Chr("92") 　\　　　<br />Chr("92") 　\<br />Chr("93") 　]<br />Chr("94") 　^<br />Chr("95") 　_<br />Chr("96") 　`<br />Chr("97") 　a　　　<br />Chr("98") 　b<br />Chr("99") 　c<br />Chr("100") 　d<br />Chr("101") 　e<br />Chr("102") 　f　　　<br />Chr("103") 　g<br />Chr("104") 　h<br />Chr("105") 　i<br />Chr("106") 　j<br />Chr("107") 　k　　　<br />Chr("108") 　l<br />Chr("109") 　m<br />Chr("110") 　n<br />Chr("111") 　o<br />Chr("112") 　p　　　<br />Chr("113") 　q<br />Chr("114") 　r<br />Chr("115") 　s<br />Chr("116") 　t<br />Chr("117") 　u　　　<br />Chr("118") 　v<br />Chr("119") 　w<br />Chr("120") 　x<br />Chr("121") 　y<br />Chr("122") 　z　　　<br />Chr("123") 　{<br />Chr("124") 　|<br />Chr("125") 　}<br />Chr("126") 　~<br />Chr("127") 　 　　　<br />Chr("128") 　 <br />Chr("129") 　&nbsp;&nbsp;&nbsp; <br />Chr("130") 　&nbsp;&nbsp; <br />Chr("131") 　&nbsp;&nbsp;&nbsp; <br />Chr("132")<img src ="http://www.blogjava.net/tbwshc/aggbug/379636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-05-31 10:19 <a href="http://www.blogjava.net/tbwshc/articles/379636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>