??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲乱码中文字幕小综合,亚洲精品色播一区二区 ,久久久久se色偷偷亚洲精品avhttp://m.tkk7.com/tbwshc/category/51844.htmlzh-cnWed, 06 Jun 2012 20:42:43 GMTWed, 06 Jun 2012 20:42:43 GMT60plsql函数大全http://m.tkk7.com/tbwshc/articles/380012.htmlchen11-1chen11-1Tue, 05 Jun 2012 04:43:00 GMThttp://m.tkk7.com/tbwshc/articles/380012.htmlhttp://m.tkk7.com/tbwshc/comments/380012.htmlhttp://m.tkk7.com/tbwshc/articles/380012.html#Feedback0http://m.tkk7.com/tbwshc/comments/commentRss/380012.htmlhttp://m.tkk7.com/tbwshc/services/trackbacks/380012.html  
  A     A     ZERO   SPACE
  --------- --------- --------- ---------
  65     97    48    32
  
  2.CHRl出整数,q回对应的字W?SQL> select chr(54740) zhao,chr(65) chr65 from dual;
  
  ZH C-- -?A
  
  3.CONCATq接两个字符?SQL> select concat('010-','88888888')||'?3' 高乾竞电(sh)?from dual;
  
  TB高乾竞电(sh)?br />  ----------------
  010-88888888?3
  
  4.INITCAPq回字符串ƈ字W串的第一个字母变为大?SQL> select initcap('smith') upp from dual;
  
  UPP-----Smith
  
  5.INSTR(C1,C2,I,J)在一个字W串中搜索指定的字符,q回发现指定的字W的位置;C1 被搜索的字符?nbsp;   C2 希望搜烦(ch)的字W串  I 搜烦(ch)的开始位|?默认?Q?J 出现的次?默认?Q若I敎ͼ则从N开始搜索?br />  SQL> select instr('oracle traning','ra',1,2) instring from dual;
  
  INSTRING
  ---------
      9
  
  6.LENGTHq回字符串的长度;SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;
  
  NAME  LENGTH(NAME) ADDR       LENGTH(ADDR)    SAL LENGTH(TO_CHAR(SAL))
  ------ ------------ ---------------- ------------ --------- --------------------
  高乾竞      3 北京?jng)v锭区        6  9999.99          7
  
  7.LOWERq回字符?q将所有的字符写SQL> select lower('AaBbCcDd')AaBbCcDd from dual;
  
  AABBCCDD
  --------
  aabbccdd
  
  8.UPPERq回字符?q将所有的字符大写SQL> select upper('AaBbCcDd') upper from dual;
  
  UPPER
  --------
  AABBCCDD
  
  9.RPAD和LPAD(_脓(chung)字符)RPAD 在列的右边粘贴字WLPAD 在列的左边粘贴字WSQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;
  
  LPAD(RPAD('GAO',1
  -----------------
  *******gao*******不够字符则用*来填?br />  
  10.LTRIM和RTRIM  LTRIM 删除左边出现的字W串RTRIM 删除双出现的字W串SQL> select ltrim(rtrim('  gao qian jing  ',' '),' ') from dual;
  
  LTRIM(RTRIM('
  -------------
  gao qian jing
  
  11.SUBSTR(string,start,count)取子字符?从start开始(如果start是负敎ͼ从尾部开始)(j),取count个SQL> select substr('13088888888',3,8) from dual;
  
  SUBSTR('
  --------
  08888888
  
  12.REPLACE('string','s1','s2')string  希望被替换的字符或变?s1    被替换的字符串s2    要替换的字符串SQL> select replace('he love you','he','i') from dual;
  
  REPLACE('H
  ----------
  i love you
  
  13.SOUNDEXq回一个与l定的字W串读音相同的字W串SQL> create table table1(xm varchar(8));SQL> insert into table1 values('weather');SQL> insert into table1 values('wether');SQL> insert into table1 values('gao');
  
  SQL> select xm from table1 where soundex(xm)=soundex('weather');
  
  XM
  --------
  weatherwether
  
  14.TRIM('s' from 'string')LEADING  剪掉前面的字WTRAILING 剪掉后面的字W如果不指定,默认为空格符
  
  15.ABSq回指定值的l对值SQL> select abs(100),abs(-100) from dual;
  
  ABS(100) ABS(-100)
  --------- ---------
  100    100
  
  16.ACOSl出反余弦的值SQL> select acos(-1) from dual;
  
  ACOS(-1)
  ---------
  3.1415927
  
  17.ASINl出反正弦的值SQL> select asin(0.5) from dual;
  
  ASIN(0.5)
  ---------
  .52359878
  
  18.ATANq回一个数字的反正切值SQL> select atan(1) from dual;
  
  ATAN(1)
  ---------
  .78539816
  
  19.CEILq回大于或等于给出数字的最整数SQL> select ceil(3.1415927) from dual;
  
  CEIL(3.1415927)
  ---------------
  4
  
  20.COSq回一个给定数字的余uSQL> select cos(-3.1415927) from dual;
  
  COS(-3.1415927)
  ---------------
  -1
  
  21.COSHq回一个数字反余u值SQL> select cosh(20) from dual;
  
  COSH(20)---------242582598
  
  22.EXPq回一个数字e的nơ方根SQL> select exp(2),exp(1) from dual;
  
  EXP(2)  EXP(1)
  --------- ---------
  7.3890561 2.7182818
  
  23.FLOOR对给定的数字取整数SQL> select floor(2345.67) from dual;
  
  FLOOR(2345.67)
  --------------
  2345
  
  24.LNq回一个数字的Ҏ(gu)值SQL> select ln(1),ln(2),ln(2.7182818) from dual;
  
  LN(1)   LN(2) LN(2.7182818)
  --------- --------- -------------
  0 .69314718   .99999999
  
  25.LOG(n1,n2)q回一个以n1为底n2的对?SQL> select log(2,1),log(2,4) from dual;
  
  LOG(2,1) LOG(2,4)
  --------- ---------
  0     2
  
  26.MOD(n1,n2)q回一个n1除以n2的余数SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;
  
  MOD(10,3) MOD(3,3) MOD(2,3)
  --------- --------- ---------
  1     0     2
  
  27.POWERq回n1的n2ơ方根SQL> select power(2,10),power(3,3) from dual;
  
  POWER(2,10) POWER(3,3)
  ----------- ----------
  1024     27
  
  28.ROUND和TRUNC按照指定的精度进行舍入SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;
  
  ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
  ----------- ------------ ----------- ------------
  56     -55     55     -55
  
  29.SIGN取数字n的符?大于0q回1,于0q回-1,{于0q回0SQL> select sign(123),sign(-100),sign(0) from dual;
  
  SIGN(123) SIGN(-100)  SIGN(0)
  --------- ---------- ---------
  1     -1     0
  
  30.SINq回一个数字的正u值SQL> select sin(1.57079) from dual;
  
  SIN(1.57079)
  ------------
  1
  
  31.SIGHq回双曲正u的值SQL> select sin(20),sinh(20) from dual;
  
  SIN(20) SINH(20)
  --------- ---------
  .91294525 242582598
  
  32.SQRTq回数字n的根SQL> select sqrt(64),sqrt(10) from dual;
  
  SQRT(64) SQRT(10)
  --------- ---------
  8 3.1622777
  
  33.TANq回数字的正切值SQL> select tan(20),tan(10) from dual;
  
  TAN(20)  TAN(10)
  --------- ---------
  2.2371609 .64836083
  
  34.TANHq回数字n的双曲正切值SQL> select tanh(20),tan(20) from dual;
  
  TANH(20)  TAN(20)
  --------- ---------
  1 2.2371609
  
  35.TRUNC按照指定的精度截取一个数SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;
  
  TRUNC1 TRUNC(124.16666,2)
  --------- ------------------
  100       124.16
  
  36.ADD_MONTHS增加或减L份SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;
  
  TO_CHA
  ------
  200002SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;
  
  TO_CHA
  ------
  199910
  
  37.LAST_DAYq回日期的最后一天SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;
  
  TO_CHAR(SY TO_CHAR((S
  ---------- ----------
  2004.05.09 2004.05.10SQL> select last_day(sysdate) from dual;
  
  LAST_DAY(S----------31-5?-04
  
  38.MONTHS_BETWEEN(date2,date1)l出date2-date1的月份SQL> select months_between('19-12?1999','19-3?1999') mon_between from dual;
  
  MON_BETWEEN
  -----------
  9SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;
  
  MON_BETW
  ---------
  -60
  
  39.NEW_TIME(date,'this','that')l出在this时区=other时区的日期和旉SQL> 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;
  
  BJ_TIME       LOS_ANGLES
  ------------------- -------------------
  2004.05.09 11:05:32 2004.05.09 18:05:32
  
  40.NEXT_DAY(date,'day')l出日期date和星期x之后计算下一个星期的日期SQL> select next_day('18-5?2001','星期?) next_day from dual;
  
  NEXT_DAY
  ----------
  25-5?-01
  
  41.SYSDATE用来得到pȝ的当前日期SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;
  
  TO_CHAR(SYSDATE,'
  -----------------
  09-05-2004 星期日trunc(date,fmt)按照l出的要求将日期截断,如果fmt='mi'表示保留?截断USQL> 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;
  
  HH         HHMM
  ------------------- -------------------
  2004.05.09 11:00:00 2004.05.09 11:17:00
  
  42.CHARTOROWID字W数据类型{换ؓ(f)ROWIDcdSQL> select rowid,rowidtochar(rowid),ename from scott.emp;
  
  ROWID       ROWIDTOCHAR(ROWID) ENAME
  ------------------ ------------------ ----------
  AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITHAAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLENAAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARDAAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES
  
  43.CONVERT(c,dset,sset)源字符?sset从一个语a字符集{换到另一个目的dset字符集SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;
  
  conver
  ------
  strutz
  
  44.HEXTORAW一个十六进制构成的字符串{换ؓ(f)二进?br />  
  45.RAWTOHEXT一个二q制构成的字W串转换为十六进?br />  
  46.ROWIDTOCHARROWID数据cd转换为字W类?br />  
  47.TO_CHAR(date,'format')SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
  
  TO_CHAR(SYSDATE,'YY
  -------------------
  2004/05/09 21:14:41
  
  48.TO_DATE(string,'format')字W串转化为ORACLE中的一个日?br />  
  49.TO_MULTI_BYTE字W串中的单字节字W{化ؓ(f)多字节字WSQL> select to_multi_byte('?) from dual;
  
  TO--?br />  
  50.TO_NUMBER给出的字符转换为数字SQL> select to_number('1999') year from dual;
  
  YEAR
  ---------
  1999
  
  51.BFILENAME(dir,file)指定一个外部二q制文gSQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));
  
  52.CONVERT('x','desc','source')x字段或变量的源source转换为descSQL> 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';
  
  SID    SERIAL#     USERNAME         CMD
  --------- --------- ------------------------------ ------
  1     1           none       2
  1                none       3
  1                none       4
  1                none       5
  1                none       6
  1                none       7
  1275               none       8
  1275               none       9
  20 GAO              select      10
  40 GAO              none
  
  53.DUMP(s,fmt,start,length)DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2cd的值SQL> col global_name for a30SQL> col dump_string for a50SQL> set lin 200SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;
  
  GLOBAL_NAME          DUMP_STRING
  ------------------------------ --------------------------------------------------
  ORACLE.WORLD          Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D
  
  54.EMPTY_BLOB()和EMPTY_CLOB()q两个函数都是用来对大数据类型字D进行初始化操作的函?br />  
  55.GREATESTq回一l表辑ּ中的最大?x较字W的~码大小.SQL> select greatest('AA','AB','AC') from dual;
  
  GR--ACSQL> select greatest('?,'?,'?) from dual;
  
  GR--?br />  
  56.LEASTq回一l表辑ּ中的最?SQL> select least('?,'?,'?) from dual;
  
  LE--?br />  
  57.UIDq回标识当前用户的唯一整数SQL> show userUSER ?GAO"SQL> select username,user_id from dba_users where user_id=uid;
  
  USERNAME             USER_ID
  ------------------------------ ---------
  GAO                  25
  
  58.USERq回当前用户的名字SQL> select user from dual;
  
  USER
  ------------------------------
  GAO
  
  59.USEREVNq回当前用户环境的信?opt可以?ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZEISDBA 查看当前用户是否是DBA如果是则q回trueSQL> select userenv('isdba') from dual;
  
  USEREN------FALSESQL> select userenv('isdba') from dual;
  
  USEREN------TRUESESSIONq回?x)话标志SQL> select userenv('sessionid') from dual;
  
  USERENV('SESSIONID')
  --------------------
  152ENTRYIDq回?x)话人口标志SQL> select userenv('entryid') from dual;
  
  USERENV('ENTRYID')
  ------------------
  0INSTANCEq回当前INSTANCE的标志SQL> select userenv('instance') from dual;
  
  USERENV('INSTANCE')
  -------------------
  1LANGUAGEq回当前环境变量SQL> select userenv('language') from dual;
  
  USERENV('LANGUAGE')
  ----------------------------------------------------
  SIMPLIFIED CHINESE_CHINA.ZHS16GBKLANGq回当前环境的语a的羃写SQL> select userenv('lang') from dual;
  
  USERENV('LANG')
  ----------------------------------------------------
  ZHSTERMINALq回用户的终端或机器的标志SQL> select userenv('terminal') from dual;
  
  USERENV('TERMINA
  ----------------
  GAOVSIZE(X)q回X的大?字节)数SQL> select vsize(user),user from dual;
  
  VSIZE(USER) USER
  ----------- ------------------------------
  6 SYSTEM
  
  
  
  60.AVG(DISTINCT|ALL)all表示Ҏ(gu)有的值求q_?distinct只对不同的值求q_值SQLWKS> create table table3(xm varchar(8),sal number(7,2));语句已处理。SQLWKS> insert into table3 values('gao',1111.11);SQLWKS> insert into table3 values('gao',1111.11);SQLWKS> insert into table3 values('zhu',5555.55);SQLWKS> commit;
  
  SQL> select avg(distinct sal) from gao.table3;
  
  AVG(DISTINCTSAL)
  ----------------
  3333.33
  
  SQL> select avg(all sal) from gao.table3;
  
  AVG(ALLSAL)
  -----------
  2592.59
  
  61.MAX(DISTINCT|ALL)求最大?ALL表示Ҏ(gu)有的值求最大?DISTINCT表示对不同的值求最大?相同的只取一ơSQL> select max(distinct sal) from scott.emp;
  
  MAX(DISTINCTSAL)
  ----------------
  5000
  
  62.MIN(DISTINCT|ALL)求最?ALL表示Ҏ(gu)有的值求最?DISTINCT表示对不同的值求最?相同的只取一ơSQL> select min(all sal) from gao.table3;
  
  MIN(ALLSAL)
  -----------
  1111.11
  
  63.STDDEV(distinct|all)求标准差,ALL表示Ҏ(gu)有的值求标准?DISTINCT表示只对不同的值求标准差SQL> select stddev(sal) from scott.emp;TB
  
  STDDEV(SAL)
  -----------
  1182.5032
  
  SQL> select stddev(distinct sal) from scott.emp;
  
  STDDEV(DISTINCTSAL)
  -------------------
  1229.951
  
  64.VARIANCE(DISTINCT|ALL)求协方差
  
  SQL> select variance(sal) from scott.emp;
  
  VARIANCE(SAL)
  -------------
  1398313.9
  
  65.GROUP BY主要用来对一l数q行l计SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;
  
  DEPTNO   COUNT(*) SUM(SAL)
  --------- --------- ---------
  10     3   8750
  20     5   10875
  30     6   9400
  
  66.HAVING对分l统计再加限制条件SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;
  
  DEPTNO COUNT(*) SUM(SAL)
  --------- --------- ---------
  20     5   10875
  30     6   9400SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;
  
  DEPTNO COUNT(*) SUM(SAL)
  --------- --------- ---------
  20     5   10875
  30     6   9400
  
  67.ORDER BY用于Ҏ(gu)询到的结果进行排序输出SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;
  
  DEPTNO   ENAME    SAL
  --------- ---------- ---------
  10 KING  5000    10 CLARK
  2450    10 MILLER
  1300    20 SCOTT
  3000    20 FORD
  3000    20 JONES
  2975    20 ADAMS
  1100    20 SMITH
  800    30 BLAKE
  2850    30 ALLEN
  1600    30 TURNER
  1500    30 WARD
  1250    30 MARTIN
  1250    30 JAMES


chen11-1 2012-06-05 12:43 发表评论
]]>
PL/SQL~码规范http://m.tkk7.com/tbwshc/articles/379912.htmlchen11-1chen11-1Mon, 04 Jun 2012 03:52:00 GMThttp://m.tkk7.com/tbwshc/articles/379912.htmlhttp://m.tkk7.com/tbwshc/comments/379912.htmlhttp://m.tkk7.com/tbwshc/articles/379912.html#Feedback0http://m.tkk7.com/tbwshc/comments/commentRss/379912.htmlhttp://m.tkk7.com/tbwshc/services/trackbacks/379912.html1. PL/SQL~码规范

PL/SQL对大写不敏感,故切忌用大写区分变量和其它用户定义的元素。ؓ(f)使代码具有可L,可遵循以下简单的大小写规则以便在源代码中区分q些元素Q?/span>

²         全部保留字?/span>Oracle提供的程序包、内建函数、用户定义的常数?/span>Oracle和用户定义的数据cdQ以?qing)模式名均采用大写?/span>

²         所有程序命名和q程名称全部采用?/span>写?/span>

²         修改前必MCVSd最新的版本去,同时如存在多个h同时修改的情况,h意协调分工,注意事后合ƈ版本?/span>

²         所有的包和q程{?/span>PL/SQL脚本Q请最新的攑֜CVS?/span>,

\JCN\20Engineering\20.40SourceCode\PLSQL\q个目录下?/span>

Q?/span>FUNCTION?/span>PACKAGE{要分开放)(j)

 

   文g的\径如下图片所C?/span>

 

如果是改修的Q请C囄Baseline下去取文?/span>,然后保存Cq\径:(x)

 

²         PL/SQL的包和包体将采用一个文Ӟ名称为包的名字,保留?/span>CVS,请不要将包和包体分开Z个文?/span>update?/span>CVS?/span>

²         在提交到CVS上去以前Q请清理掉(f)时的变量Q和~码的时候采用的临时表等Qƈh式化你的代码Q不定期会(x)对代码进?/span>review?/span>

 

1.1. PL/SQLE序命名规范

1.              无论?/span>PL/SQL对象q是PL/SQL对象内部用的变量和游标等Q都必须能从名称上能让h理解变量和游标的含义Q而且一定要做好注释?/span>

2.              传到CVS上的文本文g全部采用’.sql’作ؓ(f)文g名的后缀

1.1.1.   存储q程

存储q程的命名必ȝ合USP_DETAILNAME格式Q其?USP表示是存储过E,DETAILNAME是与存储q程意义相关的意义的名称Q如QUSP_BUSINESS_RULE?/span>

1.1.2.   软g?/span>

软g包的命名必须W合PKG_ DETAILNAME格式Q其?PKG表示是Y件包Q?DETAILNAME是与软g包意义相关的意义的名Uͼ例如QPKG_SORCE_ALL?/span>

1.1.3.   触发?/span>

触发器的的命名必ȝ合TRG_DETAILNAME格式Q其中TRG表示是触发器QDETAILNAME是与触发器用途相关的意义的名Uͼ具体可以参考已有的TRIGGER对象?/span>

1.1.4.   函数

 函数的命名必ȝ合F(tun)NC_DETAILNAME格式Q其中FNC表示是函敎ͼQDETAILNAME是与函数意义相关的意义名Uͼ例如QFNC_SALARYCOUNT?/span>

1.1.5.   变量&游标

1.    变量的命名必ȝ合规U?请采?/span>”XXX_variablename开?其中XXX表示变量的类型。Variablename表示变量名,如ؓ(f)函数传入参数h据传入类型加上IN,OUT,INOUT {,? IN_NUM_CUST_CODE.

 

2.    如果依据表的字段请采?type或?rowtype方式。请不要直接定义变量?/span>

如:(x)NUM_CUST_CODE TableName.CUST_CODE%type

 

3.    昄游标请采?/span>” CUR_开_(d)在代码开头请说明Q同时说明游标的定义.

如:(x)CUR_CUST_INFO

 

 

 

4.    所有的变量前必d上变量类型的标志,NUMBER型采用NUM,VARCAHR2 采用VARQ而在函数{入口的传入Ҏ(gu) IN_VAR_CUST_NAME,OUT_NUM_CODE,INOUT_NUM_CODE的方式来区分变量的类型是否位IN,OUT,INOUTcd

5.    不能过30个字W,不能采用关键字,要以字母开头?/span>

 

 

?/strong>tb: 以上命名规则主要在于新建对象时使用Q如果在原有的PL/SQL对象的基上修改,h照原来代码的命名规范Q注意做好代码的注释。同时必dPL/SQL代码开_(d)做好注释说明?/strong>



chen11-1 2012-06-04 11:52 发表评论
]]>
Oracle中的PLsql的符可释大?/title><link>http://m.tkk7.com/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://m.tkk7.com/tbwshc/articles/379730.html</guid><wfw:comment>http://m.tkk7.com/tbwshc/comments/379730.html</wfw:comment><comments>http://m.tkk7.com/tbwshc/articles/379730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tbwshc/comments/commentRss/379730.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tbwshc/services/trackbacks/379730.html</trackback:ping><description><![CDATA[<p>W二?PL/SQL基础 <br />一、字W?a ><span style="color: #000000">tb</span></a>?/p> <p>在PL/SQLE序中,允许出现的字W集包括Q?</p> <p>大小写字?A-Z和a-z) <br />数字(0-9) <br />W号( ) + - * / < > = ! ~ ^ ; : . ’ @ % , " # $ & _ | { } ? [ ] <br />制表W、空格和回RW?<br />PL/SQL对大写不敏感,所以,除了(jin)在字W串和字W中Q小写字母和它对应的大写字母是等L(fng)?</p> <p>二、词法单?/p> <p>PL/SQL包含很多词法单元(lexical unit)Q大致可以分Z下几c:(x) </p> <p>分隔W?单符号和复合W号) <br />标识W,其中包括关键?<br />文字 <br />注释 <br />为改善可L,我们可以用空格将词法单元分隔开。实际上Q我们必d盔R的两个标识符用空格或标点W号隔开。下面这L(fng)写法是不允许的,因ؓ(f)关键字END和IFq到一起了(jin)Q?</p> <p>IF  x > y tdEN  high := x; ENDIF; -- not allowed  </p> <p>q有Q除?jin)字W串和注释以外,我们不可以在词法单元中嵌入空根{例如,像下面的赋值符号中间就不用被分开Q?</p> <p>count : = count + 1; -- not allowed  </p> <p>Z(jin)让层ơ结构清楚,我们可以用回车符来换行,I格或制表符来进行羃q。比较一下下面两DIF语句的可L:(x) </p> <p>IF  x>y tdEN  max:=x;ELSE  max:=y;END  IF ;  IF  x > y tdEN <br />  MAX     := x;<br />ELSE <br />  MAX     := y;<br />END  IF ;  </p> <p>1、分隔符</p> <p>分隔W是对PL/SQL有着Ҏ(gu)意义的简单或复合的符受例如,我们使用加号和减可L(fng)分隔W来表现数学q算。简单分隔符只有一个字W?</p> <p>W号 含义 <br />+ 加法操作W?<br />% 属性指C符 <br />’ 字符串分隔符 <br />. lg选择?<br />/ 触法操作W?<br />( 表达式或列表分隔W?<br />) 表达式或列表分隔W?<br />: d量指C符 <br />, 分隔W?<br />* 多应用程序操作符 <br />" 引用标识W分隔符 <br />= 关系操作W?<br />< 关系操作W?<br />> 关系操作W?<br />@ q程讉K指示W?<br />; 语句l结W?<br />- 减号/负号操作W?</p> <p>复合分割W由两个字符l成?/p> <p>W号 含义 <br />:= 赋值操作符 <br />=> 联操作W?<br />|| q接操作W?<br />** 求幂操作W?<br /><< 标签分隔W?开? <br />>> 标签分隔W?l束) <br />/* 多行注视分隔W?开? <br />*/ 多行注视分隔W?l束) <br />.. 范围操作W?<br /><> 关系操作W?<br />!= 关系操作W?<br />~= 关系操作W?<br />^= 关系操作W?<br /><= 关系操作W?<br />>= 关系操作W?<br />-- 单行注释提示W?</p> <p>2、标识符</p> <p>我们可以使用标识W来为PL/SQLE序中的帔R、变量、异常、游标、游标变量、子E序和包命名。下面是一些标识符的例子:(x) </p> <p>X <br />t2 <br />phone# <br />credit_limit <br />LastName <br />oracle$number <br />标识W可以由字母、数字、美元符?$)、下划线(_)和数字符?#)l成。而像q字W?-)、斜U?/){符号都是不允许使用的。如下例: </p> <p>mine&yours -- 不允怋用连字符(not allowed because of ampersand) <br />debit-amount -- 不允怋用连字符(not allowed because of hyphen) <br />on/off -- 不允怋用斜U?not allowed because of slash) <br />user id -- 不允怋用空?not allowed because of space) <br />而用美元符受下划线和数字符号都是允许的Q?</p> <p>money$$$tree <br />SN## <br />try_again_ <br />我们也可以用大写混合的Ş式来~写标识W。但是要CQ除?jin)字W串和字W以外,PL/SQL对大写是不敏感的。所以,只在大小写上有区别的标识W,PL/SQL?x)把它们当做同一标识处理Q如下例Q?</p> <p>lastname <br />LastName -- 与lastname相同 <br />LASTNAME -- 与lastname和Lastname相同 <br />标识W的长度不能过30。对于标识符的命名尽可能代表某种含义Q避免用像cpmq样的命名,而是使用cost_per_tdousandq样意义明确的命名方式?</p> <p>保留关键?<br />对于某些标识W,我们U它们ؓ(f)保留关键?reserved word)Q因为对于PL/SQL来说Q它们有着Ҏ(gu)含义Q不可以被重新定义。例如BEGIN和ENDQ它们代表块或子E序的v始和l束而被PL/SQL 保留下来。在下面的例子中Q我们可以看刎ͼ如果重定义一个关键字的话Q就?x)生一个编译错误:(x) </p> <p>DECLARE <br />  end BOOLEAN ; -- not allowed; causes compilation error  </p> <p>但像下面q样把保留关键字嵌套在标识符中用是允许的:(x) </p> <p>DECLARE <br />  end_of_game BOOLEAN ; -- allowed  </p> <p>通常Q保留关键字都是以大写Ş式存在的Q这栯够增强可L。但是,跟其他PL/SQL标识W一P保留关键字也可以使用写或大写混合的Ş式?</p> <p>预定义标?<br />在包STANDARD中声明的全局标识W?如INVALID_NUMBER)是可以被重新声明的。但是,不徏议重新声明预定义标识W,因ؓ(f)q样做的l果?x)本地声明覆盖全局声明?</p> <p>引用标识W?<br />Z(jin)获取更多的灵zL,PL/SQL允许我们用双引号标识符夹v来。这L(fng)标识W很用,但有时它们非常有用。它们可以包含Q何可打印字符Q其中空g包含在内Q但是,不可以包含双引号。因此,下面q些引用标识W都是有效的Q?</p> <p>"X+Y" <br />"last name" <br />"on/off switch" <br />"employee(s)" <br />"*** header info ***" <br />除了(jin)双引号以外,引用标识W最多可以包?0个字W。虽然把PL/SQL保留关键字作为引用标识符是被允许的,但这q不是一个好的编E习(fn)惯?</p> <p>有些PL/SQL保留关键字ƈ不是SQL的保留关键字。例如,我们可以在CREATE TABLE语句中用TYPE作ؓ(f)字段名。但是,如果E序中的SQL语句要引用到q个字段的话Q就?x)发生编译错误?x) </p> <p>SELECT  acct, type, bal INTO  ... -- causes compilation error  </p> <p>Z(jin)避免发生q样的错误,需要把字段名用双引号夹hQ?</p> <p>SELECT  acct, "TYPE", bal INTO  ...  </p> <p>要注意的是,字段名不能采用小写或大小写؜合的形式(CREATE TABLE语句中除?。例如,下面的语句是无效的:(x) </p> <p>SELECT  acct, "type", bal INTO  ... -- causes compilation error  </p> <p>q有一U做法就是可以徏立视图来为原来的字段名更换一个新名?</p> <p>3、文?/p> <p>文字是一个数字、字W、字W串或布?yu)?Boolean)倹{它本n是数据而不是对数据的引用,如数?47和布?yu)(dng)值FALSE都是文字?</p> <p>数字文字 <br />在算术表辑ּ中有两种数字文字可以使用Q整数和实数。整数文字不带小数点Q有一个可选的W号Q例子如下:(x) </p> <p>030 6 -14 0 +32767  </p> <p>实数文字带有数点,也有一个可选的W号Q例子如下:(x) </p> <p>6.6667 0.0 -12.0 3.14159 +8300.00 .5 25.  </p> <p>PL/SQL?2.0?5.q样的数字都当作实数处理Q虽然它们只有整数部分倹{?</p> <p>数字文字不能包含元W号或是逗号Q但可以使用U学记数法。只要在数字后面d一个E(或e)Q再跟上一个整数即?W号可?。比如下面几个例子:(x) </p> <p>2E5 1.0E-7 3.14159e0 -1E38 -9.5e-3  </p> <p>E代表?jin)十的幂Q即?times ten to tde power of)。E后面的整数g表指数?*是幂操作W?</p> <p>5E3 = 5 * 10**3 = 5 * 1000 = 5000<br />-- tde double asterisk (**) is tde exponentiation operator  </p> <p>在上面的例子里,数点向右移动三个位|,而在下面q个例子中,我们把E后面的数字改?3Q就能让数点向左移动三个位|:(x) </p> <p>5E-3 = 5 * 10**-3 = 5 * 0.001 = 0.005  </p> <p>再D一个例子。如果字W文字的范围不在1E-130?0E125之间Q就?x)生编译错误?x) </p> <p>DECLARE <br />  n NUMBER ;<br />BEGIN <br />  n := 10E127;   -- causes a 'numeric overflow or underflow' error  </p> <p>字符文字 <br />字符文字是由单引号夹v来的一个单独的字符。字W文字包括PL/SQL字符集中所有的可打印字W:(x)字母、数字、空格和Ҏ(gu)W号。如下例所C:(x) </p> <p>'Z' , '%' , '7' , ' ' , 'z' , '('  </p> <p>对于字符文字来说QPL/SQL是大写敏感的。例如,PL/SQL?x)?Z'?z'当成不同的字W。字W?0'?9'虽不与整数文字等P但它们可以被应用于算术表辑ּ中,因ؓ(f)它们?x)被隐式地{换成整数?</p> <p>字符串文?<br />字符值可以用标识W来表示Q或是写成字W串文字Q字W串文字是由单引号夹v来的零个或多个字W,如下例所C:(x)</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'  </p> <p>除了(jin)I字W串('')之外Q所有的字符串文字都是CHARcd。如果我们想表现一个单引号字符串的话,可以用两个连l的单引h表示Q?</p> <p>'Don' 't leave witdout saving your work.'  </p> <p>PL/SQL对字W串是大写敏感的。例如,下面两个字符串是不相同的Q?</p> <p>'baker' <br />'Baker'  </p> <p>布尔(Boolean)文字 <br />布尔文字可以用值TRUE、FALSE和NULL(表示~失、未知或不可用的?来表C。记住,布尔文字本n是|而不是字W串?/p> <p>日期因类型的不同Q有很多表现形式Q比如下面的例子Q?<br />DECLARE <br />  d1 DATE  := DATE  '1998-12-25' ;<br />  t1 TIMESTAMP  := TIMESTAMP  '1997-10-22 13:01:01' ;<br />  t2 TIMESTAMP  WItd  TIME  ZONE  := TIMESTAMP  '1997-01-31 09:26:56.66 +02:00' ;<br />  -- tdree years and two montds <br />  -- (For greater precision, we would use tde day-to-second interval) <br />  i1 INTERVAL  YEAR  TO  MONtd  := INTERVAL  '3-2'  YEAR  TO  MONtd ;<br />  -- Five days, four hours, tdree minutes, two and 1/100 seconds <br />  i2 INTERVAL  DAY  TO  SECOND  := INTERVAL  '5 04:03:02.01'  DAY  TO  SECOND ;<br />  ...  </p> <p>我们可以指定间隔值是YEAR TO MONtdcdq是DAY TO SECONDcd。如Q?</p> <p>current_timestamp - current_timestape  </p> <p>上面表达式的l果值类型默认是INTERVAL DAY TO SECONDE。我们还可以使用下面的方法来指定间隔cdQ?</p> <p>(interval_expression) DAY TO SECOND <br />(interval_expression) YEAR TO MONtd <br />4、注?/p> <p>PL/SQL~译器会(x)忽略注释Q但我们不可以这样做。添加注释能让我们的E序更加易读。通常我们d注释的目的就是描q每D代码的用途。PL/SQL支持两种注释风格Q单行和多行?</p> <p>单行注释 <br />单行注释׃对连字符(--)开头。如下例Q?/p> <p>-- begin processing <br />SELECT  sal INTO  salary<br />  FROM  emp -- get current salary <br /> WHERE  empno = emp_id;<br />bonus := salary * 0.15; -- compute bonus amount  </p> <p>注释可以出现在一条语句的末端。在试或调试程序的时候,有时我们想禁用某行代码,可以用注释l它"注掉"(comment-out)Q如下面的例子:(x) </p> <p>-- DELETE FROM emp WHERE comm IS NULL;  </p> <p>多行注释 <br />多行注释由斜U星?/*)开_(d)星号斜线(*/)l尾Q可以注释多行内宏V示例如下:(x)</p> <p>BEGIN <br />  ...<br />  /* Compute a 15% bonus for top-rated employees. */ <br />  IF  rating > 90 tdEN <br />    bonus := salary * 0.15 /* bonus is based on salary */ <br />  ELSE <br />    bonus := 0;<br />  END  IF ;<br />  ...<br />  /* tde following line computes tde area of a<br />  circle using pi, which is tde ratio between<br />  tde circumference and diameter. */ <br />  area := pi * radius**2;<br />END ;  </p> <p>我们可以使用多行注释注掉整块代码Q如下例所C:(x) </p> <p>/*<br />LOOP<br />  FETCH c1<br />   INTO emp_rec;<br />  EXIT WHEN c1%NOTFOUND;<br />  ...<br />END LOOP;<br />*/  </p> <p>三、声?/p> <p>在PL/SQL中,我们可以在块、子E序或包的声明部分来声明帔R或变量。声明能够分配内存空_(d)指定数据cdQؓ(f)存储位置q行命名以便我们能够引用q块存储I间。下面来看一下声明的例子Q?</p> <p>birtdday    DATE ;<br />emp_count   SMALLINT  := 0;  </p> <p>W一句声明了(jin)一个DATEcd的变量。第二句声明?jin)SMALLINTcd的变量,q用赋值操作符指定?jin)初始值零。下面再看一个稍微复杂一点的例子Q用一个声明过的变量来初始化另一个变量:(x)</p> <p>pi       REAL  := 3.14159;<br />radius   REAL  := 1;<br />area     REAL  := pi * radius ** 2;  </p> <p>默认情况下,变量是被初始化ؓ(f)NULL的。所以,下面两个声明是等L(fng)Q?/p> <p>birtdday   DATE ;<br />birtdday   DATE  := NULL ;  </p> <p>对于帔R声明要多加一个CONSTANT关键字:(x)</p> <p>credit_limit   CONSTANT  REAL  := 5000.00;  </p> <p>帔R在声明的时候必进行初始化Q否则就?x)生编译错误?</p> <p>1、用DEFAULT</p> <p>我们可以使用关键字DEFAULT来替换赋值操作符为变量初始化。下面这个声?/p> <p>blood_type   CHAR  := 'o' ;  </p> <p>可以用DEFAULT来替换:(x)</p> <p>blood_type   CHAR  DEFAULT  'o' ;  </p> <p>我们可以使用DEFAULT来初始化子程序参数、游标参数和用户定义的记录中的域?/p> <p>2、用NOT NULL</p> <p>除了(jin)在声明中做初始化操作外,q可以用NOT NULLq行U束Q?</p> <p>acct_id INTEGER (4) NOT  NULL  := 9999;  </p> <p>q样一来,我们׃能ؓ(f)变量acct_id指派Ig(jin)。如果这样做的话QPL/SQL׃(x)抛出预定义异常VALUE_ERROR。NOT NULLU束后面必须跟着初始化子句。像下面q样的声明是不允许的Q?</p> <p>acct_id INTEGER (5) NOT  NULL ;   -- not allowed; not initialized  </p> <p>NATURALN和POSITIVEN是PL/SQL提供的两个不可ؓ(f)I的预定义子数据cd。下面这两个声明是等L(fng)Q?</p> <p>emp_count NATURAL  NOT  NULL  := 0;<br />emp_count NATURALN          := 0;  </p> <p>在NATURALN和POSITIVEN声明中,cd分类W后面必跟上一个初始化子句。否则就?x)发生编译错误。例如,下面的声明就是不合法的:(x) </p> <p>line_items POSITIVEN ;   -- not allowed; not initialized  </p> <p>3、?TYPE</p> <p>%TYPE属性能够ؓ(f)我们提供变量或数据库字段的数据类型。在下面的例子中Q?TYPE提供?jin)变量credit的数据类型:(x) </p> <p>credit   REAL (7, 2);<br />debit    credit%TYPE ;  </p> <p>在引用数据库中某个字D늚数据cdӞ%TYPE昑־更加有用。我们可以通过表名加字D|引用Q或是用所有者加表名加字D|引用Q?</p> <p>my_dname scott.dept.dname%TYPE ;  </p> <p>使用%TYPE声明my_dname有两个好处。首先,我们不必知道dname具体的数据类型。其ơ,如果数据库中对dname的数据类型定义发生了(jin)改变Q变量my_dname的数据类型也?x)在q行时作出相应的改变。但是要注意的是Q?TYPE只提供类型信息,q不提供NOT NULLU束信息Q所以下面这D代码即时是在emp.empno不可为空的情况下也是可以q行的:(x) </p> <p>DECLARE <br />  my_empno emp.empno%TYPE ;<br />  ...<br />BEGIN <br />  my_empno := NULL ; -- tdis works  </p> <p>4、?ROWTYPE</p> <p>%ROWTYPE属性提供数据表(或视?中一整行数据的类型信息。记录可以完整地保存从游标或游标变量中取出的当前行的信息。下面例子中Q我们声明了(jin)两个记录Q第一个保存emp表的行信息,W二个保存从游标c1取出的行信息?</p> <p>DECLARE <br />  emp_rec emp%ROWTYPE ;<br />  CURSOR  c1 IS  <br />    SELECT  deptno, dname, loc FROM  dept;<br />  dept_rec c1%ROWTYPE ;  </p> <p>我们q可以ؓ(f)指定的域q行赋值操作,如下例:(x)</p> <p>emp_rec.ename := 'JOHNSON' ;<br />emp_rec.sal   := emp_rec.sal * 1.15;  </p> <p>%ROWTYPE?TYPE一P只提供类型信息,q不能保证NOT NULLU束。在最后一个例子中Q我们?ROWTYPE来定义一个打包游?packaged cursor)Q?</p> <p>CREATE  PACKAGE  emp_actions AS <br />  CURSOR  c1 RETURN  emp%ROWTYPE ;   -- declare cursor specification <br />  ...<br />END  emp_actions;<br />CREATE  PACKAGE  BODY  emp_actions AS <br />  CURSOR  c1 RETURN  emp%ROWTYPE  IS    -- define cursor body <br />    SELECT  * FROM  emp WHERE  sal > 3000;<br />  ...<br />END  emp_actions;  </p> <p>聚合赋?<br />?ROWTYPE作声明的时候是不可以进行初始化赋值的Q但是有两种Ҏ(gu)可以一ơ性ؓ(f)所有字D赋倹{方法一Q假如两个记录类型的声明引用?jin)同一数据表或游标Q那么它们就可以怺赋|如:(x)</p> <p>DECLARE <br />  dept_rec1   dept%ROWTYPE ;<br />  dept_rec2   dept%ROWTYPE ;<br />  CURSOR  c1 IS  <br />    SELECT  deptno, dname, loc  FROM  dept;<br />  dept_rec3   c1%ROWTYPE ;<br />BEGIN <br />  ...<br />  dept_rec1 := dept_rec2;  </p> <p>但是Q如果一个类型是引用的是数据表而另一个引用的是游标的话,那么Q即使它们表现的内容相同Q也是不能相互赋值的Q?/p> <p>dept_rec2 := dept_rec3; -- not allowed  </p> <p>Ҏ(gu)二:(x)我们可以使用SELECT或FETCH语句取得的数据赋给记录。但在表或视图中定义的字D名U顺序要与记录中的名U顺序相同?</p> <p>DECLARE <br />  dept_rec dept%ROWTYPE ;<br />  ...<br />BEGIN <br />  SELECT  * INTO  dept_rec FROM  dept WHERE  deptno = 30;<br />  ...<br />END ;  </p> <p>但是Q我们不能用赋D句来把字D列表中的Dl记录。所以,下面的语法Ş式是不允许的Q?/p> <p>record_name := (value1, value2, value3, ...); -- not allowed  </p> <p>使用别名 <br />从游标中取出的数据,如果游标定义中含有表辑ּӞ我们需要用别名才能正地?ROWTYPEcd记录赋|(x) </p> <p>DECLARE <br />  CURSOR  my_cursor IS <br />    SELECT  sal + NVL(comm, 0) wages, ename FROM  emp;<br />  my_rec my_cursor%ROWTYPE ;<br />BEGIN <br />  OPEN  my_cursor;<br />  LOOP <br />    FETCH  my_cursor INTO  my_rec;<br />    EXIT  WHEN  my_cursor%NOTFOUND;<br />    IF  my_rec.wages > 2000 tdEN <br />      INSERT  INTO  temp VALUES  (NULL , my_rec.wages, my_rec.ename);<br />    END  IF ;<br />  END  LOOP ;<br />  CLOSE  my_cursor;<br />END ;  </p> <p>5、声明的U束</p> <p>PL/SQL不允许向前引用。也是说我们在使用变量或常量之前必d声明。像下面q样的语句就是不合法的:(x) </p> <p>maxi   INTEGER  := 2 * mini;   -- not allowed <br />mini   INTEGER  := 15;  </p> <p>但是QPL/SQL允许向前声明子程序?</p> <p>对于同样数据cd的每一个变量,都必d独声明:(x) </p> <p>i   SMALLINT ;<br />j   SMALLINT ;<br />k   SMALLINT ;  </p> <p>像下面这L(fng)声明方式是不允许的:(x) </p> <p>i, j, k   SMALLINT ;   -- not allowed  </p> <p>四、PL/SQL命名规范</p> <p>同样的命名规U适用于所有的PL/SQLE序Q规U涉?qing)的内容包括帔R、变量、游标、异常、过E、函数和包。命名可能是单的Q加以限定的Q远E的或是既加以限定又是远E的。例如,我们也许可能用到以下几种调用q程raise_salary的方式:(x) </p> <p>raise_salary(...);   -- simple <br />emp_actions.raise_salary(...);   -- qualified <br /><a href="mailto:raise_salary@newyork">raise_salary@newyork</a>(...);   -- remote <br /><a href="mailto:emp_actions.raise_salary@newyork">emp_actions.raise_salary@newyork</a>(...);   -- qualified and remote  </p> <p>W一U情况,我们只是单的使用E序名称。第二种情况Q我们必M用点标志(dot notation)来引用过E,因ؓ(f)它是保存在emp_actions包中的。第三种情况Q用远E访问指C符Q就能引用数据库q接newyorkQ因E是存放在远E数据库的。第四中情况Q我们在q程名称加上限定修饰词ƈ引用数据库连接?</p> <p>同义?<br />我们可以创徏同义词来隐藏q程模式对象的位|,其中包括表、视图、序列、存储函数、包、和对象cd。但是,我们不能为子E序或包中声明的内容创徏同义词,其中包括帔R、变量、游标变量、异常和打包子程序?</p> <p>作用?<br />同一作用域内声明的标识符都必L唯一的。所以,即它们的数据类型不同,变量和参C不能享用同一名称。下例中Q第二个声明是不允许的:(x)</p> <p>valid_id   BOOLEAN ;<br />valid_id   VARCHAR2  (5);   -- not allowed duplicate identifier  </p> <p>大小写敏?<br />像所有的标识W一P帔R、变量和参数的名U都是大写不敏感的。例如,PL/SQL认ؓ(f)下面的名U都是相同的Q?</p> <p>zip_code   INTEGER ;<br />zip_code   INTEGER ;   -- same as zip_code  </p> <p>命名解析 <br />在SQL语句中,数据库字D名U的优先U要高于本地变量和Ş式参数。例如,下面的DELETE语句?x)从emp表删除所有的雇员信息Q而不只是名字?KING"的雇员:(x) </p> <p>DECLARE <br />  ename   VARCHAR2  (10) := 'KING' ;<br />BEGIN <br />  DELETE  FROM  emp<br />        WHERE  ename = ename;<br />  ...  </p> <p>在这U情况下Qؓ(f)?jin)避免生歧义,可以像下面这样在本地变量和Ş式参数的前面加上cM?my_"q样的前~Q?/p> <p>DECLARE <br />  my_ename VARCHAR2 (10);  </p> <p>或是使用块标{来q行引用限定Q?</p> <p><<main>><br />DECLARE <br />  ename   VARCHAR2  (10) := 'KING' ;<br />BEGIN <br />  DELETE  FROM  emp<br />        WHERE  ename = main.ename;<br />  ...  </p> <p>下面的例子演CZ(jin)如何使用子程序名U来限定Ҏ(gu)地变量和形式参数的引用:(x) </p> <p>FUNCTION  bonus (deptno IN  NUMBER , ...) RETURN  REAL  IS <br />  job CHAR (10);<br />BEGIN <br />  SELECT  ... WHERE  deptno = bonus.deptno AND  job = bonus.job;<br />  ...  </p> <p>五、PL/SQL标识W的作用?scope)和可见度(visiblity)</p> <p>Ҏ(gu)识符的引用可以通过它的作用域和可见度来q行解析。标识符的作用域是我们引用标识W的E序单元区域(块,子程序或?。一个标识符只在它的作用域内可见Q我们可以在作用域内不用限定词而直接引用它。下图演CZ(jin)变量x的作用域和可见度。x首先被声明在闭块中Q然后又在子块中重新定义?</p> <p> <br />PL/SQL块中声明的标识符对于其所在块来说是本地的Q对于子块来说是全局的。如果全局标识W在子块中被重新声明Q那么,全局和本地声明的标识W在子块的作用域都是存在的,但是Q只有本地标识符是可见的Q这时如果想引用全局标识W,需要添加限定修饰词?</p> <p>虽然我们不能在同一块中两次声明同一标识W,但可以在两个不同的块中声明同一标识W。这两个标识W是互相独立的,对其中Q何一个的改变都不?x)?jing)响到另一个。但是,一个块不能引用同一U别中另外一个块中的变量Q因为对于它来说Q同U块中标识符即不是本地的Q又不是全局的?</p> <p>下面的例子演CZ(jin)作用域规则:(x) </p> <p>DECLARE <br />  a   CHAR ;<br />  b   REAL ;<br />BEGIN <br />  -- identifiers available here: a (CHAR), b <br />  DECLARE <br />    a   INTEGER ;<br />    c   REAL ;<br />  BEGIN <br />    -- identifiers available here: a (INTEGER), b, c <br />  END ;</p> <p>  DECLARE <br />    d   REAL ;<br />  BEGIN <br />    -- identifiers available here: a (CHAR), b, d <br />  END ;<br />  -- identifiers available here: a (CHAR), b <br />END ;  </p> <p>如果子块中重新声明了(jin)全局标识W,本地标识W优先权高于全局标识W,我们׃能再引用全局标识W,除非使用限定?qualified name)。修饰词可以是封闭块的标{,如下例所C:(x) </p> <p><<outer>><br />DECLARE <br />  birtddate   DATE ;<br />BEGIN <br />  DECLARE <br />    birtddate   DATE ;<br />  BEGIN <br />   ...<br />    IF  birtddate = OUTER.birtddate tdEN <br />      ...<br />    END  IF ;<br />    ...<br />  END ;<br />  ...<br />END ;  </p> <p>如下例所C,限定修饰词也可以是封闭子E序的名Uͼ(x) </p> <p>PROCEDURE  check_credit(...) IS <br />  rating   NUMBER ;</p> <p>  FUNCTION  valid(...)<br />    RETURN  BOOLEAN  IS <br />    rating   NUMBER ;<br />  BEGIN <br />    ...<br />    IF  check_credit.rating < 3 tdEN  ...<br />  END ;<br />BEGIN <br />  ...<br />END ;  </p> <p>但是Q在同一作用域内Q标{֒子程序不能用相同的命名?</p> <p>六、变量赋?/p> <p>变量和常量都是在E序q入块或子程序的时候被初始化的。默认情况下Q变量都是被初始化成NULL的。除非我们ؓ(f)变量指定一个|否则l果是未知的。请看下面的例子Q?</p> <p>DECLARE <br />  count INTEGER ;<br />BEGIN <br />  -- COUNT began witd a value of NULL . <br />  -- tdus tde expression ’COUNT + 1’ is also null. <br />  -- So after tdis assignment, COUNT is still NULL . <br />  count := count + 1;  </p> <p>Z(jin)避免q样的情况,p保证在赋g前不要用这个变量?</p> <p>我们可以使用表达式来为变量赋|例如下面的语句ؓ(f)变量bonus赋|(x) </p> <p>bonus := salary * 0.15;  </p> <p>q里Q我们需要保证的是salary * 0.15计算l果的类型必dbonuscd保持一致?</p> <p>1、布?yu)(dng)?Boolean)赋?/p> <p>只有TRUE、FALSE和NULL才可以赋l布?yu)(dng)类型的变量。例如:(x) </p> <p>BEGIN <br />  done := FALSE ;<br />  WHILE  NOT  done LOOP <br />    ...<br />  END  LOOP ;  </p> <p>当表辑ּ中用关pL作符的时候,q回l果也是布尔cd的|所以下面的语句也是允许的?</p> <p>done := (count > 500);  </p> <p>2、利用SQL查询为PL/SQL变量赋?/p> <p>我们可以使用SELECT语句让Oracle为变量赋倹{对于查询字D中的每一,在INTO子句的后面都必须有与之对应的cd兼容的变量。看一下下面这个例子:(x)</p> <p>DECLARE <br />  emp_id     emp.empno%TYPE ;<br />  emp_name   emp.ename%TYPE ;<br />  wages      NUMBER (7,2);<br />BEGIN <br />  -- assign a value to emp_id here <br />  SELECT    ename, sal + comm INTO  emp_name, wages<br />    FROM    emp<br />   WHERE    empno = emp_id;<br />  ...<br />END ;  </p> <p>但是Q上面的用法不可以ؓ(f)布尔cd变量赋倹{?</p> <p>七、PL/SQL表达式与比较</p> <p>表达式由操作数和操作W构成。一个操作数是一个变量、常量、文字或是能够返回一个值的函数。下面是一个简单的数学表达式:(x) </p> <p>-X / 2 + 3  </p> <p>像负?-)q样的只作用于一个操作数的操作符UCؓ(f)一元操作符Q而像除号(/)q样作用于两个操作数的操作符UCؓ(f)二元操作W。PL/SQL没有三元操作W?</p> <p>最单的表达式就是一个能直接出值的变量。PL/SQL按照指定的操作符和操作数来计表辑ּ的|l果值的数据cd是由表达式所在的兌文决定的?/p> <p>׃操作W的q算优先U不同,表达式的计算序也是不一L(fng)。下表是默认的操作符优先U顺序?/p> <p>操作W?q算 <br />** 求幂 <br />+, - 正,?<br />*, / 乘,?<br />+, -, || 加,减,q接 <br />=, <, >, <=, >=, <>, !=, ~=, ^=, <br />IS NULL, LIKE, BETWEEN, IN 比较 <br />NOT 逻辑?<br />AND ?<br />OR ?</p> <p>优先U高的操作符?x)比优先U低的操作符先求倹{下例中Q两个表辑ּ都能计算出结?来,因ؓ(f)除号的优先要高于加受优先相同的操作符不会(x)采取Ҏ(gu)的计顺序?</p> <p>5 + 12 / 4</p> <p>12 / 4 + 5  </p> <p>我们可以使用括号控制计算序。例如,下面的表辑ּ值是7Q而不?1Q因为括可盖了(jin)默认的操作符优先序Q?</p> <p>(8 + 6) / 2  </p> <p>再看一个例子。下面的q算中,减法?x)在除法之前被计,q是因ؓ(f)最深层的表辑ּLW一个被计算的:(x) </p> <p>100 + (20 / 5 + (7 - 3))  </p> <p>最后,我们看看如何使用括号来改善可L,即不是在必M用括L(fng)时候:(x) </p> <p>(salary * 0.05) + (commission * 0.25)  </p> <p>1、逻辑操作W?/p> <p>逻辑操作W有AND、OR和NOTQ其中AND和OR是二元操作符Q而NOT是一元操作符。下面是对应操作的真D?</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>如上面的真D所C,AND只在操作W两边的操作数都是真的情冉|q回TRUE。另一斚wQOR操作W两边的操作数只要有一个gؓ(f)真就能返回TRUE。NOT?x)返回操作数相反的倹{例如NOT TRUEq回FALSE?/p> <p>q里需要注意的地方是,׃NULL是一个不定的|所以NOT NULL的g是无法确定的?</p> <p>q算序 <br />当我们不用括h定计顺序的时候,操作W的优先U就?x)决定操作数的计顺序。比较下面两个表辑ּQ?</p> <p>NOT  (valid AND  done)  NOT  valid AND  done  </p> <p>如果布尔变量valid和done的值都是FALSEQ那么第一个表辑ּ的结果就为TRUE。但是,W二个表辑ּ的结果却是FALSEQ因为NOT的优先要比AND高。因此,W二个表辑ּq价于Q?/p> <p>(NOT  valid) AND  done  </p> <p>在下面的例子中,当valid的gؓ(f)FALSEQ不论done值是多少Q整个表辑ּ的值Mؓ(f)FALSEQ?</p> <p>valid AND  done  </p> <p>同样Q当下例中的valid的gؓ(f)TRUEӞ不论done值是多少Q整个表辑ּ的值Mؓ(f)TRUEQ?</p> <p>valid OR  done  </p> <p>短\计算 <br />在计逻辑表达式时QPL/SQL使用的是短\计算Ҏ(gu)。也是_(d)PL/SQL在结果可以确定下来的时候,׃?x)再l箋计算表达式的g(jin)。看一下下面这个例子:(x)</p> <p>DECLARE <br />  ...<br />  on_hand    INTEGER ;<br />  on_order   INTEGER ;<br />BEGIN <br />  ...<br />  IF  (on_hand = 0) OR  ((on_order / on_hand) < 5) tdEN <br />    ...<br />  END  IF ;<br />END ;  </p> <p>当on_hand的值是零的时候,操作WOR左面的操作数l果为TRUEQ所以PL/SQL׃需要计右边的g(jin)。如果PL/SQL是在应用OR操作W之前计两个操作数的值的话,那么双的操作数׃(x)产生一个除零的错误。不怎样Q依赖于"短\"计算不是一个好?fn)惯?/p> <p>比较操作W?<br />比较操作W用于将一个表辑ּ与另一个表辑ּq行比较。结果是TRUE或FALSE或NULL。最常见的就是我们在条g控制语句和SQL数据操作语句中的WHERE子句中用比较操作符。例如:(x) </p> <p>IF  quantity_on_hand > 0 tdEN <br />  UPDATE  inventory<br />     SET  quantity = quantity - 1<br />   WHERE  part_number = item_number;<br />ELSE <br />  ...<br />END  IF ;  </p> <p>关系操作W?<br />关系操作W可以让我们随意比较复杂的表辑ּ。下面的表格列出?jin)各U关pL作符的含义?</p> <p>操作W?含义 <br />=  {于 <br /><>, !=, ~=, ^=  不等?<br /><  于 <br />>  大于 <br /><=  于{于 <br />>=  大于{于 </p> <p>IS NULL 操作W?<br />如果IS NULL所作用的操作数为空Q则q回l果TRUEQ否则返回结果FALSE。与Ig比较Q结果LI。所以,无论什么时候跟Ig比较Q都要用IS NULL操作W:(x) </p> <p>IF  variable IS  NULL  tdEN  ...  </p> <p>LIKE操作W?<br />我们可以使用LIKE操作W来判断一个字W、字W串或CLOBcd的值是不是与我们指定的样式相匹配。如果样式匹配,LIKE׃(x)q回TRUEQ否则返回FALSE。用于LIKE匚w的样式中Q包含两U通配W。下划线(_)Q精匹配一个字W;癑ֈ?%)Q匹配零个或多个字符。如下面的例子中Q如果ename的值是"JOHNSON"Q那么表辑ּl果׃ؓ(f)TRUEQ?/p> <p>ename LIKE  'J%SON'  </p> <p>BETWEEN操作W?<br />BETWEEN操作W用于判断目标值是否在指定的目标范围内。例如,下面表达式的l果׃ؓ(f)FALSEQ?</p> <p>45 BETWEEN  38 AND  44  </p> <p>IN操作W?<br />IN操作W是用于试目标值是否是集合成员之一。其中,集合是可以包含NULL值的Q但它们是被忽略的。例如,下面q个语句q不?x)删除enamegؓ(f)NULL的行Q?</p> <p>DELETE  FROM  emp<br />      WHERE  ename IN  (NULL , 'KING' , 'FORD' );  </p> <p>此外Q如果集合中包含?jin)NULL|下面表达式的q算l果是FALSE?/p> <p>value NOT  IN  set  </p> <p>所以,下面q个表达式也不会(x)删除M行:(x) </p> <p>DELETE  FROM  emp<br />      WHERE  ename NOT  IN  (NULL , 'king' );  </p> <p>q接操作W?<br />双竖U?||)可以当作字符q接操作W,可以两个字W串(CHAR、VARCHAR2、CLOB或等L(fng)Unicode支持的类?q接h。例如表辑ּ</p> <p>'suit'  || 'case'  </p> <p>q回的结果就?/p> <p>'suitcase'  </p> <p>如果操作W两边的操作数都是CHARcdQ连接操作符q回的结果就是CHAR倹{如果其中一个是CLOB|操作W就q回临时CLOB。其余情况均q回VARCHAR2cd?/p> <p>2、布?yu)(dng)表辑ּ?/p> <p>PL/SQL允许我们在SQL语句和过E语句中比较变量和常量。这L(fng)比较UCؓ(f)布尔表达式,它们是由用关pL作符分割开的简单或复杂表达式组成。通常Q布?yu)(dng)表辑ּ是由逻辑操作WAND、OR或NOTq接。布?yu)(dng)表辑ּ的运结果LTRUE、FALSE或NULL?</p> <p>在SQL语句中,布尔表达式能让我们指定一个表中哪些行记录可以被媄(jing)响。在q程语句中,布尔表达式是条g控制的基。其中有三种布尔表达式:(x)术、字W和日期?</p> <p>布尔术表达?<br />我们可以使用关系表达式来比较两个数字{或不等。例如,下面的表辑ּl果׃ؓ(f)真:(x)</p> <p>number1    := 75;<br />number2    := 70;</p> <p>number1 > number2   -- TRUE  </p> <p>布尔字符表达?<br />我们也可以比较字W的{或不等。默认情况下Q比较都是基于字W串中每个字节的二进制值的。比如,下面例子中的表达式结果就为真Q?/p> <p>string1    := 'Katdy' ;<br />string2    := 'Katdleen' ;</p> <p>string1 > string2   -- TRUE  </p> <p>讄初始化参数NLS_COMP=ANSIQ就能用初始化参数NLS_SORT指定的整理序?collating sequence)来进行比较。整理序列是一个字W集中表现字W的数字代码(numeric code)的内部顺序,如果一个字W的数字代码比另一个大Q那q个字符比另一个字W大。关于字W在整理序列中出现的位置Q每U语a都可能有不同的定义规则。比如说Q重韛_母可能会(x)因数据库的字W集的不同而排序不同,即每一U情况下的二q制值都相同?/p> <p>布尔日期表达?<br />对于日期cd的比较,是按照年代的序的。如下例Qdate1的值是大于date2的值的?</p> <p>date1    := '01-JAN-91' ;<br />date2    := '31-DEC-90' ;</p> <p>date1 > date2   -- TRUE  </p> <p>关于PL/SQL的布?yu)(dng)表辑ּ使用的一些徏?<br />一般地Q不要把实型数字用于_比较。实型数字一般都是按q似值存储的。所以,下面的表式式值ƈ不等于TRUEQ?</p> <p>COUNT    := 1;</p> <p>IF  COUNT = 1.0 tdEN <br />  ...<br />END  IF ;  </p> <p>在作比较时用括h一个好?fn)惯。例如,下面的这L(fng)表达式Ş式是不允许的Q因?100 < tax 的结果是布尔型,而布?yu)(dng)型是不能和数?00q行比较的?/p> <p>100 < tax < 500   -- not allowed  </p> <p>解决Ҏ(gu)是用下面这L(fng)表达式:(x) </p> <p>(100 < tax) AND  (tax < 500)  </p> <p>对于布尔型的变量来说Q它的D么ؓ(f)TRUE要么为FALSEQ因此,对布?yu)(dng)型变量应用比较操作是多余的。对于下面的内容Q?/p> <p>WHILE  NOT (done = TRUE ) LOOP <br />  ...<br />END  LOOP ;  </p> <p>可以化ؓ(f)Q?/p> <p>WHILE  NOT  done LOOP <br />  ...<br />END  LOOP ;  </p> <p>对COLBcd应用比较操作W或是用LIKE和BETWEENq样的函数时Q可能会(x)产生临时LOB。我们就得确保有_大的表空间来容纳q些临时LOB?</p> <p>3、CASE表达?/p> <p>一个CASE表达式从一个或多个供选方案中选择一个返回结果。CASE表达式用一个选择器来军_q回哪一个分支的l果。具体的语法形式如下Q?</p> <p>CASE  selector<br />  WHEN  expression1 tdEN  result1<br />  WHEN  expression2 tdEN  result2<br />  ...<br />  WHEN  expressionn tdEN  resultn<br />  [ELSE  resultN+1]<br />END ;  </p> <p>选择器后面跟着一个或多个WHEN子句Q它们会(x)被依ơ验证的。一旦有一个WHEN子句满条g的话Q剩下的分支条g׃再执行了(jin)。例如:(x)</p> <p>DECLARE <br />  grade       CHAR (1)      := 'B' ;<br />  appraisal   VARCHAR2 (20);<br />BEGIN <br />  appraisal    := CASE  grade<br />                   WHEN  'A'  tdEN  'Excellent' <br />                   WHEN  'B'  tdEN  'Very Good' <br />                   WHEN  'C'  tdEN  'Good' <br />                   WHEN  'D'  tdEN  'Fair' <br />                   WHEN  'F'  tdEN  'Poor' <br />                   ELSE  'No such grade' <br />                 END ;<br />END ;  </p> <p>其中QELSE子句是可选的Q工作方式同IF语句中的ELSE子句怼。如果我们不提供ELSE子句Qƈ且选择器没有匹配Q何WHEN子句Q表辑ּ的返回的l果是NULL?/p> <p>q种形式的CASE表达式的另外一U用方法就是CASE语句Q其中每个WHEN子句都可以是一个完整的PL/SQL块?</p> <p>搜烦(ch)式CASE表达?<br />PL/SQL也提供了(jin)搜烦(ch)式的CASE表达式,它的语法形式如下Q?</p> <p>CASE <br />  WHEN  expression1 tdEN  result1<br />  WHEN  expression2 tdEN  result2<br />  ...<br />  WHEN  expressionn tdEN  resultn<br />  [ELSE  resultN+1]<br />END ;  </p> <p>搜烦(ch)式CASE表达式没有选择器。每个WHEN子句包含一个能q回布尔值的搜烦(ch)条g。例子如下:(x) </p> <p>DECLARE <br />  grade       CHAR (1);<br />  appraisal   VARCHAR2 (20);<br />BEGIN <br />  ...<br />  appraisal    := CASE <br />                   WHEN  grade = 'A'  tdEN  'Excellent' <br />                   WHEN  grade = 'B'  tdEN  'Very Good' <br />                   WHEN  grade = 'C'  tdEN  'Good' <br />                   WHEN  grade = 'D'  tdEN  'Fair' <br />                   WHEN  grade = 'F'  tdEN  'Poor' <br />                   ELSE  'No such grade' <br />                 END ;<br />  ...<br />END ;  </p> <p>搜烦(ch)条g按顺序计。搜索条件的布尔值决定了(jin)哪个WHEN子句被执行。如果搜索条件的gؓ(f)TRUEQ它对应的WHEN子句׃(x)被执行。只要其中一?WHEN子句被执行,后箋的搜索条件就不会(x)被计了(jin)。如果没有匹配的条gQ可选的ELSE׃(x)被执行。如果没有匹配的WHEN子句Q也没有ELSE子句Q表辑ּ的结果就为NULL?</p> <p>4、在比较和条件语句中处理NULL?/p> <p>在用NULL值时Q我们一定要C下面几条规则Q避免发生一些常见的错误Q?</p> <p>比较中如果有I值的话,那么计算l果Mؓ(f)NULL <br />对空值应用逻辑操作WNOTQ结果还是NULL <br />条g控制语句中,如果条g的运结果gؓ(f)NULL的话Q与之相关的语句׃?x)被执?<br />单CASE语句中对于空值的判断要用WHEN expression IS NULL <br />下例中,我们期待的是sequence_of_statements被执行,因ؓ(f)x和y看v来就是不{的。但是,׃NULL是不定的|那么Qx是否{于y也就无法定?jin)。所以,sequence_of_statementsq不?x)执行?</p> <p>x    := 5;<br />y    := NULL ;<br />...<br />IF  x != y tdEN    -- yields NULL, not TRUE <br />  sequence_of_statements; -- not executed <br />END  IF ;  </p> <p>同样Q下例中的sequence_of_statements也不?x)被执行Q?</p> <p>a    := NULL ;<br />b    := NULL ;<br />...<br />IF  a = b tdEN    -- yields NULL, not TRUE <br />  sequence_of_statements; -- not executed <br />END  IF ;  </p> <p>NOT操作W?<br />让我们再回忆一下逻辑操作WNOTQ当对一个NULL值应用NOTӞl果LNULL。因此,下面两段内容q不相同?</p> <p>IF  x > y tdEN <br />  high    := x;<br />ELSE <br />  high    := y;<br />END  IF ;  IF  NOT  x > y tdEN <br />  high    := y;<br />ELSE <br />  high    := x;<br />END  IF ;  </p> <p>当IF条ggؓ(f)FALSE或NULLӞELSE部分׃(x)被执行。如果x和y都不为NULL的话Q两D늨序运行的效果是一L(fng)。但是,如果IF条g为NULL的话Q第一D|ly赋|而第二段是给x赋倹{?</p> <p>雉度字W串 <br />PL/SQL把零长度字符串当作空值处理,q其中包括由字符函数和布?yu)(dng)表辑ּq回的倹{下面的语句均是l目标变量赋I值的操作Q?/p> <p>null_string    := TO_CHAR('');<br />zip_code       := SUBSTR(address, 25, 0);<br />valid          :=(NAME != '');  </p> <p>所以,对于(g)空字符Ԍ要用IS NULL操作W:(x) </p> <p>IF  my_string IS  NULL  tdEN  ...  </p> <p>q接操作W?<br />q接操作W会(x)忽略I|例如表达?/p> <p>'apple'  || NULL  || NULL  || 'sauce'  </p> <p>?x)返?</p> <p>'applesauce'  </p> <p>函数 <br />如果l内|函C递空|一般也都会(x)q回I|但以下几U情况除外?/p> <p>函数DECODE它的第一个参数和后面的一个或多个表达式相比较(表达式的值有可能为空)Q如果比较的内容相匹配,׃(x)q回后面的结果表辑ּ。例如在下面的例子中Q如果字Drating的gؓ(f)I,DECODE׃(x)q回1000Q?/p> <p>SELECT  DECODE(rating,<br />              NULL , 1000,<br />              'C' , 2000,<br />              'B' , 4000,<br />              'A' , 5000<br />             )<br />  INTO  credit_limit<br />  FROM  accts<br /> WHERE  acctno = my_acctno;  </p> <p>函数NVL在判断出W一个参数是I的情况下,?x)返回第二个参数的|否则直接q回W一个参数的倹{用方法如下:(x) </p> <p>start_date := NVL(hire_date, SYSDATE );  </p> <p>函数REPLACEW二个参数是NULL的时候,它就?x)返回第一个参数的|不管是否有第三个参数。例如,在下面例子中Q结果字W串new_string的值和old_string的值完全一栗?</p> <p>new_string := REPLACE(old_string, NULL , my_string);  </p> <p>如果W三个参Cؓ(f)I的话,REPLACE׃(x)把第一个参C出现的第二个参数删除Q然后返回结果。如下面q个例子Q?/p> <p>  syllabified_name    := 'gold - i - locks' ;<br />  NAME                := REPLACE(syllabified_name,<br />                                 ' - ' ,<br />                                 NULL <br />                                );  </p> <p>q算的结果字W串?goldilocks"。如果第二个和第三个参数都是NULL|REPLACEq接返回第一个参数?</p> <p>八、内|函?/p> <p>PL/SQL为我们提供了(jin)许多功能强大的数据操作函数。这些函数可以分Z下几c:(x) </p> <p>错误报告 <br />数字 <br />字符 <br />cd转换 <br />日期 <br />对象引用 <br />杂项 <br />下面的表格是各个分类的函数?/p> <p>错误  数字  字符  转换  日期  对象引用  杂项 <br />SQLCODE ABS ASCII CHARTOROWID ADD_MONtdS DEREF BFILENAME <br />SQLERRM ACOS CHR CONVERT CURRENT_DATE REF DECODE <br />  ASIN CONCAT HEXTORAW CURRENT_TIMESTAMP VALUE DUMP <br />  ATAN INITCAP RAWTOHEX DBTIMEZONE TREAT EMPTY_BLOB <br />  ATAN2 INSTR ROWIDTOCHAR EXTRACT   EMPTY_CLOB <br />  BITAND INSTRB TO_BLOB FROM_TZ   GREATEST <br />  CEIL LENGtd TO_CHAR LAST_DAY   LEAST <br />  COS LENGtdB TO_CLOB LOCALTIMESTAMP   NLS_CHARSET_DECL_LEN <br />  COSH LOWER TO_DATE MONtdS_BETWEEN   NLS_CHARSET_ID <br />  EXP LPAD TO_MULTI_BYTE NEW_TIME   NLS_CHARSET_NAME <br />  FLOOR LTRIM TO_NCLOB NEXT_DAY   NVL <br />  LN NLS_INITCAP TO_NUMBER NUMTODSINTERVAL   SYS_CONTEXT <br />  LOG NLS_LOWER TO_SINGLE_BYTE NUMTOYMINTERVAL   SYS_GUID <br />  MOD NLSSORT   ROUND   UID <br />  POWER NLS_UPPER   SESSIONTIMEZONE   USER <br />  ROUND REPLACE   SYSDATE   USERENV <br />  SIGN RPAD   SYSTIMESTAMP   VSIZE <br />  SIN RTRIM   TO_DSINTERVAL     <br />  SINH SOUNDEX   TO_TIMESTAMP     <br />  SQRT SUBSTR   TO_TIMESTAMP_LTZ     <br />  TAN SUBSTRB   TO_TIMESTAMP_TZ     <br />  TANH TRANSLATE   TO_YMINTERVAL     <br />  TRUNC TRIM   TZ_OFFSET     <br />    UPPER   TRUNC     </p> <p>除了(jin)错误报告(error-reporting)函数SQLCODE和SQLERRM之外Q我们可以在SQL语句中用上面所有的函数。同P<a ><span style="color: #000000">tbw淘宝商城</span></a>我们可以在过E表辑ּ中用除?jin)对象引用函数DEFREF、REF、VALUE和杂函数(miscellaneous function)DECODE、DUMP、VSIZE之外的所有函数?</p> <p>虽然SQL聚合函数(aggregate functionQ如AVG和COUNT)和SQL解析函数(analytic functionQ如CORR和LAG)没有l合到PL/SQL中,但我们仍可以在SQL语句中用它?但不能在q程语句中??/p> <p> </p><img src ="http://m.tkk7.com/tbwshc/aggbug/379730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tbwshc/" target="_blank">chen11-1</a> 2012-06-01 12:07 <a href="http://m.tkk7.com/tbwshc/articles/379730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle中decode函数http://m.tkk7.com/tbwshc/articles/379637.htmlchen11-1chen11-1Thu, 31 May 2012 02:24:00 GMThttp://m.tkk7.com/tbwshc/articles/379637.htmlhttp://m.tkk7.com/tbwshc/comments/379637.htmlhttp://m.tkk7.com/tbwshc/articles/379637.html#Feedback0http://m.tkk7.com/tbwshc/comments/commentRss/379637.htmlhttp://m.tkk7.com/tbwshc/services/trackbacks/379637.html1.oracle?/span>decode函数

 

DECODE函数相当于一条g语句(IF).它将输入数g函数中的参数列表相比较,Ҏ(gu)输入D回一个对应倹{函数的参数列表是由若干数值及(qing)其对应结果值组成的若干序偶形式。当?dng)如果未能与Q何一个实参序偶匹配成功,则函C有默认的q回倹{区别于SQL的其它函敎ͼDECODE函数q能识别和操作空?/span>.
其具体的语法格式如下Q?/span>
DECODE(input_value,value,result[,value,result…][,default_result]);
其中Q?/span>
input_value
试图处理的数倹{?/span>DECODE函数该数g一pd的序偶相比较Q以军_最后的q回l果
value
是一l成序偶的数倹{如果输入数g之匹配成功,则相应的l果被q回。对应一个空的返回|可以使用关键?/span>NULL于之对应
result
是一l成序偶的结果?/span>
default_result
未能与Q何一序偶匚w成功Ӟ函数q回的默认?/span>
下面的例子说明了(jin)Q如何读取用?/span>CHECKUP?/span>SEAPARK中的BLOOD_TEST_FLAG列下的项目,作ؓ(f)DECODE函数的实参支持倹{?/span>
SELECT checkup_type,
DECODE(blood_test_flag,’Y’,’Yes’,’N’,’No’,NULL,’None’,’Invalid’)
FROM checkup;

 

 

2.oracle?/span>to char?/span>to date的区?/span>

 

o char 是把日期或数字{换ؓ(f)字符?/span>
to date 是把字符串{换ؓ(f)数据库中得日期类?/span>
 转换函数Ø
 TO_CHAR²
使用TO_CHAR函数处理数字
TO_CHAR(number, '格式')
TO_CHAR(salary,’$99,999.99’);
使用TO_CHAR函数处理日期
TO_CHAR(date,’格式’);
 TO_NUMBER²
使用TO_NUMBER函数字W{换ؓ(f)数字
TO_NUMBER(char[, '格式'])
 TO_DATE²
使用TO_DATE函数字W{换ؓ(f)日期
TO_DATE(char[, '格式'])

 数字格式格式²
9 代表一个数?/span>
0 强制昄0
$ 攄一?/span>$W?/span>
L 攄一个Q动本地货币符
. 昄数?/span>
, 昄千位指示W?/span>

² 日期格式
格式控制 描述
YYYY?/span>YYY?/span>YY 分别代表4位?/span>3位?/span>2位的数字q?/span>
YEAR q的拼写
MM 数字?/span>
MONTH 月的全拼
MON 月的~写
DD 数字?/span>
DAY 星期的全?/span>
DY 星期的羃?/span>
AM 表示上午或者下?/span>
HH24?/span>HH12 12时制或24时?/span>
MI 分钟
SS U钟
SP 数字的拼?/span>
TH 数字的序数词
Ҏ(gu)字符假如Ҏ(gu)字符
HH24:MI:SS AM 15:43:20 PM
DD “OF” MONTH 12 OF OCTOBER
DDSPTH fourteenth
Date的格?/span> ’18-5?/span>-84’

 

 

 

3 NVL() 函数

 从两个表辑ּq回一个非 null 倹{?br />
语法

NVL(eExpression1, eExpression2)

参数
eExpression1, eExpression2

如果 eExpression1 的计结果ؓ(f) null |?NVL( ) q回 eExpression2。如?eExpression1 的计结果不?null |则返?eExpression1。eExpression1 ?eExpression2 可以是Q意一U数据类型。如?eExpression1 ?eExpression2 的结果皆?null |?NVL( ) q回 .NULL.?br />
q回值类?/span>

字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null ?br />
说明tb

在不支持 null 值或 null 值无关紧要的情况下,可以使用 NVL( ) 来移去计或操作中的 null 倹{?/p>

select nvl(a.name,'I得') as name from student a join school b on a.ID=b.ID

注意Q两个参数得cd要匹?/span>

 

 

 



chen11-1 2012-05-31 10:24 发表评论
]]>
chr码值对应列表大?/title><link>http://m.tkk7.com/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://m.tkk7.com/tbwshc/articles/379636.html</guid><wfw:comment>http://m.tkk7.com/tbwshc/comments/379636.html</wfw:comment><comments>http://m.tkk7.com/tbwshc/articles/379636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tbwshc/comments/commentRss/379636.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tbwshc/services/trackbacks/379636.html</trackback:ping><description><![CDATA[chr码?a ><span style="color: #000000">tb</span></a>对应列表大全<br />Chr("0")  ?的字W?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(水^制表W?<br />Chr("10")  换行<br />Chr("11")  tab(垂直制表W?<br />Chr("12")  换页<br />Chr("13")  回R    chr(13)&chr(10)   回R和换行的l合<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")  l束   End<br />Chr("27")  q   Pause break<br />Chr("28")  <br />Chr("29")  <br />Chr("30")  <br />Chr("31")  <br />Chr("32")  I格 SPACE<br />Chr("33")  !<br />Chr("34")  "<br />Chr("35")  #<br />Chr("36")  $<br />Chr("37")  %<br />Chr("38")  &<br />Chr("39")  ’<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")  <<br />Chr("61")  =<br />Chr("62")  >   <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")      <br />Chr("130")     <br />Chr("131")      <br />Chr("132")<img src ="http://m.tkk7.com/tbwshc/aggbug/379636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tbwshc/" target="_blank">chen11-1</a> 2012-05-31 10:19 <a href="http://m.tkk7.com/tbwshc/articles/379636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://lanoss.com" target="_blank">ߵƵѹۿ</a>| <a href="http://langtuojidian.com" target="_blank">¶ۺ</a>| <a href="http://kkjk123.com" target="_blank">ɫͼɫС˵</a>| <a href="http://mm9d.com" target="_blank">Ļһȥ̨</a>| <a href="http://228609.com" target="_blank">ɫ͵͵ۺAV </a>| <a href="http://mllm999.com" target="_blank">ɫʹɫӰԺ</a>| <a href="http://acccx.com" target="_blank">վɫƵѿ½</a>| <a href="http://tzkanglong.com" target="_blank">˹ƷƵ</a>| <a href="http://bjsunic.com" target="_blank">91Ƶַ</a>| <a href="http://www431234.com" target="_blank">þþƷѹۿ97</a>| <a href="http://selangcun.com" target="_blank">ŮܳƵ</a>| <a href="http://bobostrong31.com" target="_blank">һһëѻƬ</a>| <a href="http://3333kkkk.com" target="_blank">777ӰƬѹۿ</a>| <a href="http://4922000.com" target="_blank">ѼƵվ</a>| <a href="http://345504.com" target="_blank">ѧaëƬѹۿ</a>| <a href="http://www-715111.com" target="_blank">˳Ƭ߹ۿ</a>| <a href="http://kyqp0022.com" target="_blank">ŮƵվa</a>| <a href="http://qzapp88.com" target="_blank">߹ۿ</a>| <a href="http://5d8f.com" target="_blank">ձĻ</a>| <a href="http://szyujiaxing.com" target="_blank">޾ǧ˾ղ</a>| <a href="http://ikybh.com" target="_blank">ӰӾ߹ۿȫ </a>| <a href="http://gzmandala.com" target="_blank">պƷרվ</a>| <a href="http://ivr69.com" target="_blank">jizzѲ</a>| <a href="http://szq18888.com" target="_blank">һ˿hdƵ</a>| <a href="http://bcz123.com" target="_blank">99þù-99þù</a>| <a href="http://tsxyhq.com" target="_blank">Ů18ëƬëƬ</a>| <a href="http://www398ph.com" target="_blank">ĻƷ</a>| <a href="http://meinvtaotu.com" target="_blank">˿Ů͵ԲĻ</a>| <a href="http://hnmxld.com" target="_blank">18gay̨ͬͬ</a>| <a href="http://8568008.com" target="_blank">ŮվɫƵ</a>| <a href="http://55118885.com" target="_blank">re99þ6Ʒ</a>| <a href="http://bying100.com" target="_blank">ѿһëƬ</a>| <a href="http://selaohu.com" target="_blank">AVƷɫ</a>| <a href="http://smalody.com" target="_blank">Ůɫһ</a>| <a href="http://cqtchtwq.com" target="_blank">߹ۿƵ</a>| <a href="http://cih60o.com" target="_blank">Ƭѹۿ</a>| <a href="http://gepuw.com" target="_blank">ҹδʮ</a>| <a href="http://w6336.com" target="_blank">պƷƵ߹ۿ</a>| <a href="http://6969aaa.com" target="_blank"></a>| <a href="http://pencilinside.com" target="_blank">Ļ13</a>| <a href="http://eee94.com" target="_blank">˳ŷĻ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>