目录 第一部分SQL语法部分。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3 一、CREATETABLE语句。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3 二、CREATESEQUENCE语句。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5 三、CREATEVIEW语句。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。6 四、INSERT语句:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。7 五、UPDATE语句:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。9 六、DELETE语句:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。10 七、TRUNCATE语句:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11 八、各类FUNCTIONS:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。12 1。转换函数:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。12 2。日期函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。16 3。字符函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。20 4。数值函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。28 5。单行函数:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。33 6。多行函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。35 第二部分PLSQL语法部分。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。39 一、PLSQL语言简介。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。39 二、变量说明。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。46 三、PLSQL控制程序流。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。50 四、存储过程。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。53 五、存储函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。53 六、PACKAGE。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。53 七、触发器。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。56 第一部分SQL语法部分 一、Createtable语句 语句:CREATETABLE〔schema。〕tablename ({columndatatype〔DEFAULTexpr〕〔columnconstraint〕。。。 tableconstraint} 〔,{columndatatype〔DEFAULTexpr〕〔columnconstraint〕。。。 tableconstraint}〕。。。) 〔〔PCTFREEinteger〕〔PCTUSEDinteger〕 〔INITRANSinteger〕〔MAXTRANSinteger〕 〔TABLESPACEtablespace〕 〔STORAGEstorageclause〕 〔RECOVERABLEUNRECOVERABLE〕 〔PARALLEL(〔DEGREE{integerDEFAULT}〕 〔INSTANCES{integerDEFAULT}〕 ) NOPARALLEL〕 〔CACHENOCACHE〕 〔CLUSTERcluster(column〔,column〕。。。)〕〕 〔ENABLEenableclause DISABLEdisableclause〕。。。 〔ASsubquery〕 表是Oracle中最重要的数据库对象,表存储一些相似的数据集合,这些数据描述成若干列或字段。createtable语句的基本形式用来在数据库中创建容纳数据行的表。createtable语句的简单形式接收表名,列名,列数据类型和大小。除了列名和描述外,还可以指定约束条件,存储参数和该表是否是个cluster的一部分。 Schema用来指定所建表的owner,如不指定则为当前登录的用户。 Tablename用来指定所创建的表名,最长为30个字符,但不可以数字开头(可为下划线),但不可同其它对象或Oracle的保留字冲突。 Column用来指定表中的列名,最多254个。 Datatype用来指定列中存储什幺类型的数据,并保证只有有效的数据才可以输入。 columnconstraint用来指定列约束,如某一列不可为空,则可指定为notnull。 tableconstraint用来指定表约束,如表的主键,外键等。 Pctfree用来指定表中数据增长而在Oracle块中预留的空间。DEFAULT为10,也就是说该表的每个块只能使用90,10给数据行的增大时使用。 Pctused用来指定一个水平线,当块中使用的空间低于该水平线时才可以向该中加入新数据行。 Parallel用来指定为加速该表的全表扫描可以使用的并行查询进程个数。 Cache用来指定该表为最应该缓存在SGA数据库缓冲池中的候选项。 Cluster用来指定该表所存储的cluster。 Tablespace用来指定用数据库的那个分区来存储该表的数据。 RecoverableUnrecoverable用来决定是否把对本表数据所作的变动写入Redo文件。以恢复对数据的操作。 As当不指定表的各列时,可利用As子句的查询结果来产生数据库结构和数据。 例: 1)createtablemytab1e(mydecdecimal, myintinteter) tablespaceuserdata pctfree5 pctused30; 2)createtablemytable2 as(selectfrommytable1); 二、createsequence语句 语句:CREATESEQUENCE〔schema。〕sequencename 〔INCREMENTBYinteger〕 〔STARTWITHinteger〕 〔MAXVALUEintegerNOMAXVALUE〕 〔MINVALUEintegerNOMINVALUE〕 〔CYCLENOCYCLE〕 〔CACHEintegerNOCACHE〕 〔ORDERNOORDER〕 序列用来为表的主键生成唯一的序列值。 Incrementby指定序列值每次增长的值 Startwith指定序列的第一个值 Maxvalue指定产生的序列的最大值 Minvalue指定产生的序列的最小值 Cycle指定当序列值逵到最大或最小值时,该序列是否循环。 Cache指定序列生成器一次缓存的值的个数 Order指定序列中的数值是否按访问顺序排序。 例: 1)createsequencemyseq incrementby4 startwith50 maxvalue60 minvalue50 cycle cache3; 2) sqlinsertintonew(newid,lastname,firstname) values(news。nextval,’daur’,’permit’); 三、createview语句 语句:CREATE〔ORREPLACE〕〔FORCENOFORCE〕VIEW〔schema。〕viewname 〔(alias〔,alias〕。。。)〕 ASsubquery 〔WITHCHECKOPTION〔CONSTRAINTconstraint〕〕 视图实际上是存储在数据库上旳select语句。每次在sql语句中使用视图时,表示该视图的select语句就用来得到需要的数据。 Orreplace创建视图时如果视图已存在,有此选项,新视图会覆盖旧的 视图。 Force如有此选项,当视图基于的表不存在或在该模式中没有创建视图的权限时,也可以建立视图。 Assubquery产生视图的select查询语句 Withcheckoption如果视图是基于单表的且表中所有的非空列都包含在视图中时,该视图可用于insert和update语句中,本选项保证在每次插入或更新数据后,该数据可以在视图中查到 例: 1)createorplaceviewnewv as selectsubstr(d。dlastname,1,3), d。dlastname,d。dfirstname,b。bstartdate,b。blocation fromnew1d, new2b whered。dlastnameb。 四、INSERT语句: 1。语法 INSERTINTO〔schema。〕{tableviewsubquery}〔dblink〕 〔(column〔,column〕。。。)〕 {VALUES(expr〔,expr〕。。。)subquery} 〔WHEREcondition〕 2。插入单行 使用VALUES关键词为新行的每一列指定一个值。如果不知道某列的值,可以使用NULL关键词将其值设为空值(两个连续的逗号也可以表示空值,也可使用NULL关键词) 插入一行时试图为那些NOTNULL的列提供一个NULL值,会返回错误信息。 举例: 插入一条记录到DEPARTMENT表中 INSERTINTODEPARTMENT (DEPARTMENTID,NAME,LOCATIONID) VALUES(01,’COMPUTER’,167) 3。插入多行 将SELECT语句检索出来的所有数据行都插入到表中。这条语句通常在从一个表向另一个表快速复制数据行。 举例: INSERTINTOORDERTEMP SELECTA。ORDERID,B。ITEMID,C。NAME,E。FIRSTNAME。E。LASTNAME, A。ORDERDATE,A。SHIPDATE,D。DESCRIPTION,B。ACTUALPRICE, B。QUANTITY,B。TOTAL FROMSALESORDERA,ITEMB,CUSTOMERC, PRODUCTD,EMPLOYEEE WHEREMONTHSBETWEEN(TODATE(A。ORDERDATE),TODATE(017月91))0 ANDA。CUSTOMERIDC。CUSTOMERID ANDC。SALESPERSONIDE。EMPLOYEEID ANDA。ORDERIDB。ORDERID ANDB。PRODUCTIDD。PRODUCTID 4。从其它表复制数据: 要快速地从一个表向另一个尚不存在的表复制数据,可以使用CREATETABLE语句定义该表并同时将SELECT语句检索的结果复制到新表中。 CREATETABLEEMPLOYEECOPY AS SELECT FROMEMPLOYEE 五、UPDATE语句: 1。语法 UPDATE〔schema。〕{tableviewsubquery}〔dblink〕〔alias〕 SET{(column〔,column〕。。。)(subquery) column{expr(subquery)}} 〔,{(column〔,column〕。。。)(subquery) column{expr(subquery)}}〕。。。 〔WHEREcondition〕 UPDATE语句更新所有满足WHERE子句条件的数据行。同样,该语句可以用SELECT语句检索得到。但SELECT必须只检索到一行数据值。否则报错。而且每更新一行数据,均要执行一次SELECT语句。 举例: UPDATEEMPLOYEECOP SETSALARY SALARY400 WHERETONUMBER(TOCHAR(HIREDATE,YYMMDD))850101 UPDATEITEMCOPA SETA。ACTUALPRICE ( SELECTB。LISTPRICE FROMPRICEB,SALESORDERC WHEREA。PRODUCTIDB。PRODUCTIDAND A。ORDERIDC。ORDERIDAND TONUMBER(TOCHAR(C。ORDERDATE,YYYYMMDD))BETWEEN TONUMBER(TOCHAR(B。STARTDATE,YYYYMMDD))AND NVL(TONUMBER(TOCHAR(ENDDATE,YYYYMMDD)),29991231) ) 六、DELETE语句: 1。语法 DELETE〔FROM〕〔schema。〕{tableview}〔dblink〕〔alias〕 〔WHEREcondition〕 DELETE语句删除所有满足WHERE子句条件的数据行。 举例: DELETEFROMitem WHEREORDERID510 七、TRUNCATE语句: 1。语法 TRUNCATE〔schema。〕table 八、各类Functions: 1。转换函数: 1。1。函數:TOCHAR 语法: TOCHAR(number〔,format〕) 用途: 将一个数值转换成与之等价的字符串。如果不指定格式,将转换成最简单的字符串形式。如果为负数就在前面加一个减号。 Oracle为数值提供了很多格式,下表列出了部分可接受的格式: 元素 描述 示例 值 结果 9hr返回指定位数的数值,前面为0,显示为空格 99999784hr578 1234567hr45。895‘784’ ‘578’ ‘’ ‘46’ 插入小数点 9999。99784 45。3482‘784。00’ ’45。35’ 在结果串的指定位置插入逗号 9,999,999784 1234567hr0。44‘784’ ‘1,234,567’ ‘0’ 返回值前面加一个元符号 99,999784 578‘784’ ‘578’ B 结果的整数部分如果是0,就显示成空格 B9999。9784 0。44‘784。0’ ‘。4’ S 返回有正负号的数值 S9999 784hr‘784’ EEEE 以科计数法表示数值 9。9EEEE45 0。0666‘4。5E01’ ‘6。7E02’ 1。2。函數:TOCHAR 语法: TOCHAR(date〔,format〕) 用途: 将按format参数指定的格式将日期值转换成相应的字符串形式。同样,Oracle提供许多的格式模型,用户可以用它们的组合来表示最终的输出格式。唯一限制就是最终的掩码不能超过22个字符。下表列出了部分日期格式化元素。 Oracle为数值提供了很多格式,下表列出了部分可接受的格式: 格式 意义 D 用数字表示星期几(1,2,3,4,5,6,7) DY 用三个字符表示星期几的缩写形式(MON) DAY 星期几的完整表示(MONDAY) DD 用数字表示一月中的几号 DDD 用数字表示年份中的天数 W 一月中的星期数 WW 一年中的星期数 MM 用数字表示月数 MON 用三个字母表示月的缩写(APR) MONTH 月的完整英文表示(FEBRUARY) Y 年份中的最后一个数字(9) YY 年份中的最后二个数字(99) YYY 年份中的最后三个数字(999) YYYY 年份用四个数字表示(1999) YEAR 年份的字母全部拼写(NINETEENNINETYNINE) AM或PM 午前或午后表示符 HH 用小时表示日期 MI 分钟表示小时 SS 秒钟表示分钟 SSSS 自午夜以来的秒数(这个数字经常在086399之间) 1。3。函數:TODATE 语法: TODATE(string,format) 用途: 根据给定的格式将一个字符串转换成Oracle的日期值。 该函数的主要用途是用来验证输入的日期值。在应用程序中,用户必须验证输入日期是否有效,如月份是否在112之间和日期中的天数是否在指定月份的天数内。 1。4。函數:TONUMBER 语法: TONUMBER(string〔,format〕) 用途: 该函数将一个字符串转换成相应的数值。对于简单的字符串转换数值(例如几位数字加上小数点)。格式是可选的。 2。日期函数 2。1。函數:ADDMONTHS 语法: ADDMONTHS(date,number) 用途: 在日期date上加指定的月数,返回一个新日期。如果给定为负数,返回值为日期date之前几个月的日期。number应当是个整数,如果是小数,正数被截为小于该数的最大整数,负数被截为大于该数的最小整数。 例如: SELECTTOCHAR(ADDMONTHS(sysdate,1), DDMONYYYY)Nextmonth FROMdual Nextmonth 19FEB2000 2。2。函數:LASTDAY 语法: LASTDAY(date) 用途: 返回日期date所在月份的最后一天的日期。 例如: SELECTSYSDATE,LASTDAY(SYSDATE)Last, LASTDAY(SYSDATE)SYSDATEDaysLeft FROMDUAL SYSDATELastDaysLeft 19JAN0031JAN0012 2。3。函數:MONTHSBETWEEN 语法: MONTHSBETWEEN(date1,date2) 用途: 返回两个日期之间的月份。如果两个日期月份内的天数相同(或者都是某个月的最后一天),返回值是整数。否则,返回值是小数,每于131月来计算月中剩余天数。如果第二个日期比第一个日期还早,则返回值是负数。 例如: SELECTMONTHSBETWEEN(TODATE(02021992,MMDDYYYY), TODATE(01011992,MMDDYYYY)) Months FROMDUAL Months 1。03225806 SELECTMONTHSBETWEEN(TODATE(02291992,MMDDYYYY), TODATE(01311992,MMDDYYYY)) Months FROMDUAL Months 1hr2。4。函數:NEXTDAY 语法: NEXTDAY(date,day) 用途: 该函数返回日期date指定若天后的日期。注意:参数day必须为星期,可以星期几的英文完整拼写,或前三个字母缩写,或数字1,2,3,4,5,6,7分别表示星期日到星期六。例如,查询返回本月最后一个星期五的日期。 例如: SELECTNEXTDAY((lastday(sysdate)7),FRIDAY) FROMdual NEXTDAY( 28JAN00 2。5。函數:ROUND 语法: ROUND(date〔,format〕) 用途: 该函数把一个日期四舍五入到最接近格式元素指定的形式。如果省略format,只返回date的日期部分。例如,如果想把时间(24010014:58:41)四舍五入到最近的小时。下表显示了所有可用格式元素对日期的影响。 FormatElement Result SS 24010014:58:41 MI 24010014:59:00 HH 24010015:00:00 DD 25010000:00:00 MM 01020100:00:00 YY 01010000:00:00 CC 01010000:00:00 例如: SELECTtochar(ROUND(sysdate,HH),DDMONYYHH24:MI:SS) FROMdual TOCHAR(ROUND(SYSDATE,HH),DDMONYYHH24:MI:SS) 24JAN0015:00:00 2。6。函數:TRUNC 语法: TRUNC(date〔,format〕) 用途: TRUNC函数与ROUND很相似,它根据指定的格式掩码元素,只返回输入日期用户所关心的那部分,与ROUND有所不同,它删除更精确的时间部分,而不是将其四舍五入。 例如: SELECTTRUNC(sysdate) FROMdual TRUNC(SYS 24JAN00 3。字符函数3。1。函數:ASCII 语法: ASCII(character) 用途: 返回指定字符的ASCII码值。如果为字符串时,返回第一个字符的ASCII码值。 例如: SELECTASCII(Z) FROMdual ASCII(Z) 90hr3。2。函數:CHR 语法: CHR(number) 用途: 该函数执行ASCII函数的反操作,返回其ASCII码值等于数值number的字符。该函数通常用于向字符串中添加不可打印字符。 例如: SELECTCHR(65)BCDEF FROMdual CHR(65 ABCDEF 3。3。函數:CONCAT 语法: CONCAT(string1,string2) 用途: 该函数用于连接两个字符串,将string2跟在string1后面返回,它等价于连接操作符()。 例如: SELECTCONCAT(‘Thisisa’,’computer’) FROMdual CONCAT(THISISA, Thisisacomputer 它也可以写成这样: SELECT‘Thisisa’’computer’ FROMdual THISISACOMPUT Thisisacomputer 这两个语句的结果是完全相同的,但应尽可能地使用操作符。 3。4。函數:INITCAP 语法: INITCAP(string) 用途: 该函数将字符串string中每个单词的第1个字母变成大写字母,其它字符为小写字母。 例如: SELECTINITCAP(firstname。lastname) FROMemployee WHEREdepartmentid12 INITCAP(FIRSTNAME。LASTN Chris。Alberts Matthew。Fisher Grace。Roberts Michael。Douglas 3。5。函數:INSTR 语法: INSTR(inputstring,searchstring〔,n〔,m〕〕) 用途: 该函数是从字符串inputstring的第n个字符开始查找搜索字符串的第m次出现,如果没有找到搜索的字符串,函数将返回0。如果找到,函数将返回位置。 例如: SELECTINSTR(thequickslyfoxjumpedoverthe lazybrowndog,the,2,1) FROMdual INSTR(THEQUICKSLYFOXJUMPEDOVERTHELAZYBROWNDOG,THE,2,1) 31hr3。6。函數:INSTRB 语法: INSTRB(inputstring,searchstring〔,n〔,m〕〕) 用途: 该函数类似于INSTR函数,不同之处在于INSTRB函数返回搜索字符串出现的字节数,而不是字符数。在NLS字符集中仅包含单字符时,INSTRB函数和INSTR函数是完全相同的。 3。7。函數:LENGTH 语法: LENGTH(string) 用途: 该函数用于返回输入字符串的字符数。返回的长度并非字段所定义的长度,而只是字段中占满字符的部分。以列实例中,字段firstname定义为varchar2(15)。 语法: SELECTfirstname,LENGTH(firstname) FROMemployee FIRSTNAMELENGTH(FIRSTNAME) JOHN4 KEVIN5 3。8。函數:LENGTHB 语法: LENGTHB(string) 用途: 该函数用于返回输入字符串的字节数。对于只包含单字节字符的字符集来说LENGTHB函数和LENGTH函数完全一样。 3。9。函數:LOWER 语法: LOWER(string) 用途: 该函数将字符串string全部转换为小写字母,对于数字和其它非字母字符,不执行任何转换。 3。10。函數:UPPER 语法: UPPER(string) 用途: 该函数将字符串string全部转换为大写字母,对于数字和其它非字母字符,不执行任何转换。 3。11。函數:LPAD 语法: LPAD(string,length〔,’set’〕) 用途: 在字符串string的左边加上一个指定的字符集set,从而使串的长度达到指定的长度length。参数set可以是单个字符,也可以是字符串。如果string的长度小于length时,取string字符串的前length个字符。 语法: SELECTfirstname,LPAD(firstname,20,) FROMemployee FIRSTNAMELPAD(FIRSTNAME,20,) JOHNJOHN KEVINKEVIN3。12。函數:RPAD 语法: RPAD(string,length〔,’set’〕) 用途: 在字符串string的右边加上一个指定的字符集set,从而使串的长度达到指定的长度length。参数set可以是单个字符,也可以是字符串。如果string的长度小于length时,取string字符串的前length个字符。 例如: SELECTfirstname,rpad(firstname,20,) FROMemployee FIRSTNAMERPAD(FIRSTNAME,20,) JOHNJOHN KEVINKEVIN 3。13。函數:LTRIM 语法: LTRIM(string〔,’set’〕) 用途: 该函数从字符串的左边开始,去掉字符串set中的字符,直到看到第一个不在字符串set中的字符为止。 例如: SELECTfirstname,ltrim(firstname,BA) FROMemployee WHEREfirstnameBARBARA FIRSTNAMELTRIM(FIRSTNAM BARBARARBARA 3。14。函數:RTRIM 语法: RTRIM(string〔,’set’〕) 用途: 该函数从字符串的右边开始,去掉字符串set中的字符,直到看到第一个不在字符串set中的字符为止。具有NULL值的字段不能与具有空白字符的字段相比较。 这是因为空白字符与NULL字符是完全不同的两种字符。该函数的另外一个用途是当进行字段连接时去掉不需要的字符。 3。15。函數:SUBSTR 语法: SUBSTR(string,start〔,length〕) 用途: 该函数从输入字符串中取出一个子串,从start字符处开始取指定长度的字符串,如果不指定长度,返回从start字符处开始至字符串的末尾。 3。16。函數:REPLACE 语法: REPLACE(string,searchset〔,replaceset〕) 用途: 该函数将字符串中所有出现的searchset都替换成replaceset字符串。可以使用该函将字符串中所有出现的符号都替换成某个有效的名字。如果不指定replaceset,则将从字符串string中删除所有的搜索字符串searchset。 例如: SELECTREPLACE(abcdefbdcdabc,dsssdcdrd,abc,ABC) FROMdual REPLACE(ABCDEFBDCDABC, ABCdefbdcdABC,dsssdcdrd3。17。函數:TRANSLATE 语法: TRANSLATE(string,searchset,replaceset) 用途: 该函数用于将所有出现在搜索字符集searchset中的字符转换成替换字符集replaceset中的相应字符。注意:如果字符串string中的某个字符没有出现在搜索字符集中。则它将原封不动地返回。如果替换字符集replaceset比搜索字符集searchset小,那么搜索字符集searchset中后面的字符串将从字符串string中删除。 例如: SELECTTRANSLATE(GYK87M,0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ, 9999999999xxxxxxxxxxxxxx) FROMdual TRANSL xx99x 4。数值函数4。1。函數:ABS 语法: ABS(number) 用途: 该函数返回数值number的绝对值。绝对值就是一个数去掉符号的那部分。 4。2。函數:SQRT 语法: SQRT(number) 用途: 该函数返回数值number的平方根,输入值必须大于等于0,否则返回错误。 4。3。函數:CEIL 语法: CEIL(number) 用途: 该函数返回大于等于输入值的下一个整数。 4。4。函數:FLOOR 语法: FLOOR(number) 用途: 该函数返回小于等于number的最大整数。 4。5。函數:MOD 语法: MOD(n,m) 用途: 该函数返回n除m的模,结果是n除m的剩余部分。m,n可以是小数,负数。 4。6。函數:POWER 语法: POWER(x,y) 用途: 该函数执行LOG函数的反操作,返回x的y次方。 4。7。函數:ROUND 语法: ROUND(number,decimaldigits) 用途: 该函数将数值number四舍五入到指定的小数字。如果decimaldigits为0,则返回整数。decimaldigits可以为负数。 4。8。函數:TRUNC 语法: TRUNC(number〔,decimalpluces〕) 用途: 该函数在指定的小数字上把一个数值截掉。如果不指定精度,函数预设精度为0。decimalpluces可以为负数。 4。9。函數:SIGN 语法: SIGN(number) 用途: 该函数返回number的符号,如果number为正数则返回1,为负数则返回1,为0则返回0。 4。10。函數:SIN 语法: SIN(number) 用途: 该函数返回弧度number的正弦值。 4。11。函數:SINH 语法: SINH(number) 用途: 该函数返回number的返正弦值。 4。12。函數:COS 语法: COS(number) 用途: 该函数返回弧度number的三角余弦值。要用角度计算余弦,可以将输入值乘以0。01745转换成弧度后再计算。 4。13。函數:COSH 语法: COSH(number) 用途: 该函数返回输入值的反余弦值。 4。14。函數:TAN 语法: TAN(number) 用途: 该函数返回弧度number的正切值。 4。15。函數:TANH 语法: TANH(number) 用途: 该函数返回数值number的反正切值。 4。16。函數:LN 语法: LN(number) 用途: 该函数返回number自然对数。 4。17。函數:EXP 语法: EXP(number) 用途: 该函数返回e(2。71828183)的number次方。该函数执行自然对数的反过程。 4。18。函數:LOG 语法: LOG(base,number) 用途: 该函数返回base为底,输入值number的对数。 5。单行函数: 单行函数中可以对任何数据类型的数据进行操作。 5。1。函數:DUMP 语法: DUMP(expression〔,format〔,start〔,length〕〕〕) 用途: 该函数按指定的格式显示输入数据的内部表示。下表列出了有效的格式。 格式代码 描述 8hr八进制 10hr十进制 16hr十六进制 17hr单字符 例如: SELECTDUMP(FARRELL,16) FROMdual DUMP(FARRELL,16) Typ96Len7:46,41,52,52,45,4c,4c 5。2。函數:GREATEST 语法: GREATEST(listofvalues) 用途: 该函数返回列表中项的最大值。对数值或日期来说,返回值是最大值或最晚日期,如果列表中包含字符串,返回值是按字母顺序列表中的最后一项。 例如: SELECTGREATEST(123,234,432,112) FROMdual GREATEST(123,234,432,112) 4325。3。函數:LEAST 语法: LEAST(listofvalues) 用途: 该函数返回列表中项的最小值。对数值或日期来说,返回值是最小值或最早日期,如果列表中包含字符串,返回值是按字母顺序列表中的第一项。 例如: SELECTLEAST(sysdate,sysdate10) FROMdual LEAST(SYS 10JAN00 5。4。函數:NVL 语法: NVL(expression,replacementvalue) 用途: 如果表达式不为空值,函数返回该表达式的值,如果是空值,就返回用来替换的值。 例如: SELECTlastname, NVL(TOCHAR(COMMISSION),NOTAPPLICABLE) FROMemployee WHEREdepartmentid30 LASTNAMENVL(TOCHAR(COMMISSION),NOTAPPLICABLE) ALLEN300 WARD500 MARTIN1400 BLAKENOTAPPLICABLE 6。多行函数 组函数可以对表达式的所有值操作,也可以只对其中不同值进行操作,组函数的语法如下所示: function〔DISTINCTALLexpression〕 如果既不指定DISTINCT,也不指定ALL,函数将对查询返回的所有数据行进行操作。不能在同一个SELECT语句的选择列中同时使用组函数和单行函数。 6。1。函數:AVG 语法: AVG(〔DISTINCTALL〕expression) 用途: 对查询返回的数据行求平均值。 例如: SELECTAVG(sal)Average FROMemp Average 2073。21429 6。2。函數:COUNT 语法: COUNT(〔DISTINCTALL〕expression) 用途: 计算表达式的个数。要计算EMP表中雇员的个数。 例如: SELECTCOUNT(deptno) FROMemp COUNT(DEPTNO) 14hrSELECTCOUNT(distinctdeptno) FROMemp COUNT(DISTINCTDEPTNO) 36。3。函數:MAX 语法: MAX(〔DISTINCTALL〕expression) 用途: 对查询返回的行集求最大值。如果有多个最大值,将所有均返回。要检索公司中最高工资的雇员。 语法: SELECTename,sal FROMemp WHEREsal(selectmax(sal) FROMemp) ENAMESAL KING5000 6。4。函數:MIN 语法: MIN(〔DISTINCTALL〕expression) 用途: 对查询返回的行集求最小值。如果有多个最小值,将所有均返回。 例如: SELECTMIN(lastname) FROMemployee MIN(LASTNAME) ADAMS 6。5。函數:SUM 语法: SUM(〔DISTINCTALL〕expression) 用途: 计算查询返回的所有非空数值的总和。如果返回的数据都是空值,则该函数也返回空值。 例如: SELECTSUM(salary)Total FROMemployee WHEREdepartmentid10 Total 8750hr6。6。函數:VARIANCE 语法: VARIANCE(〔DISTINCTALL〕expression) 用途: 该函数计算返回所有行的统计方差。 例如: SELECTVARIANCE(salary) FROMemployee VARIANCE(SALARY) 973659。27 伪列 返回值 Sequence。CURRVAL 上一次由序列产生器产生的序列名值。只有在当前实例会话中从该序列选择过一次值,这个伪列才会有效。 LEVEL 查诣的深度,LEVEL适用于特殊的树查询。 Sequence。NEXTVAL 选择这个伪列将导致序列发生器返回该序列的下一个值。一旦选择了该值,它就不能被重用,因为以后的每次检索都将返回下一个值。 ROWID 这个伪列表示数据行确切的存储位置。ROWID的格式是一个三个16进制数的结构AAAAAAAA。BBBB。CCCC,这里AAAAAAAA表示数据库文件中包含该行的块号,BBBB是数据块内部的行号,而CCCC则是数据中的文件ID。 ROWNUM 被检索数据行的序列号。 SYSDATE 当前日期和时间。 UID 当前用户的标识ID。 USER 用户登录进数据库的名字。 第二部分PLSQL语法部分 一、PLSQL语言简介 (本讲义之所有程序均调式通过) 首先我们看一个简单之例子,下面这个例子是统计从1至100的总和。 declare inumber:0;声明变量井给初值 tnumber:1; 声明一个出错处理 begin fortin1。。100loop i: ifi5050then 引发错误处理 else insertintocnt(ct)values(i); exception whenerrormessagethen insertintocnt(ct)values(0); 从上例中可以看出PLSQL语法的一般规则。 PLSQL中语句以分号(;)结尾。 开始程序块的PLSQL语句(如IF或BEGIN语句)没有分句。 文本值括在单引号(‘‘)内,而不是()。 过程只允许最后有一个出口。。 PLSQL程序可以分为三个部分 DECLARE部分用于变量、常量、函数、过程、Cursor。 BEGIN部分包含PLSQL块中要执行的代码用于程序处理,其中可以调用函数、过程。 Exception部分用于出错处理。 下面我们再看一个例子: declare inumber:1; tnumber:1; pnumber:1; createtablecny(ctnumber,coutnumber); functionaa(xxnumber)returnnumberisdefinefunction ctnumber:1; jnumber:1; begin whilejxxloop ct: j:j1; begin createtablecnt(ctnumber,coutnumber); whilei200loop t: i:i1; p:aa(i);callingfunction insertintocntvalues(t,p); 说明: 1。在定义变量可以赋初值,赋初值有两种方法,一为上程序所示,另一种为如下所示: Declare Inumberdefault92; Tnumberdefault0; 2。定义常量 Declare Iconstantnumber:1; Tconstantnumber:9; 3。定义函数 functionfunctionname(parametertype)returntypeis declarevariant begin 在上面的例子中我们定义了一个函数aa,在begin模块部分引用了此函数aa()。 4。定义过程 procedureprocedurename(parameterINtype)is declarevariant begin exception 见下例: declare inumber:1; tnumber:1; proceduretet(ttnumber)is定义一个函数 begin insertintocnt1(t1)values(tt); begin 調用函數 foriin1。。100loop tet(i); 5。定义Cursor declare temp1 temp2 cursortest1 begin opentest1; deletefromcnt1; loop fetchtest1intotemp1,temp2; exitwhentest1 insertintocnt1values(temp1,temp2);a closetest1; 我们在open一个cursor时,可能会存在一种情况,即我们不需要cursor中所有之记录,我们该如何处理: 1。在定义一个cursor时,可以附带参数如下所示 declae cursorc1(pempid)is selectempno, dempptc1 begin openc1(123); loop fetchc1(123)intodemppt 2。在将cursor中之记录项转到变量中时进行控制,如下所示: declare cursoris selectemptno, begin loop fetchc1into(pno,pname); 用於到cursor中變量進行控制 ifcondition1then endif 注意: 因为PLSQL不支持IO,所以程序所有结果都是放在数据档中。 Deletefromacctswherestatus’baddebt’ Ifsqlrowcount10then R E 另: 在声明一个变量时,PLSQL提供两种变量类型:TYPE,ROWTYPE。 1。TYPE 使用TYPE时,可以有种用法: 一用法见下例: declare Balancenumber(7,2); Minimumbalancebalancetype:10。00; 在上例中,minimumbalance数据类型为number(7,2)具默认值为10。00。 二用法见下例(将数据类型与table中一columndatatype相对应起来,如果table中columndatatype变更,则在运行时,上数据类型会自动的变换上): declare mydnameempc。 2。rowtype 使用rowtype数据类型用于将table和cursor中一数据行相对起来。 见下例: Declare 定義一個rowtype類型,與mycursor中記錄行對應。 Cursormycursorisselectsalnvl(comm,0)salcomm,wages, M Begin O 將mycursor中之記錄寫到myrec變量中去。 loop F E Ifmyrec。wages200then Insertintotempvalues(null,myrec。wages,myrec。ename); E E C E 二、变量说明 在PLSQL中包括以下几种常见的变量类型: CHAR存储定长的ASCII字符串,允许存储数字,文本文符等,最长可255个字符。 VARCHAR2存储变长的字符串,尽管伋按符串的最大长度来定义,但VARCHAR2和CHAR的区别在于如果达不到定义的长度,下的空间不会自动的填写为空格,VARCHAR2最大可以放入2000个字符。 DATE实际上是存储时间信息的日期时间戳,在使用日期时,应考虑怎样使用日期函数。有关日期函数的格式见函数说明部分。 127hrNUMBER存储数值数据,包括整数和浮点数、数据范围可以从110到3810,而且,你有很大的数据空间。 BOOLENA存储布尔值。它表示是否,真假,10之类的东西。 LONG这是一种文本字符串,其长度大于VARCHAR2字段的2000个字符。该类最多可储存2GB个字符,与原始二进制数据相比,它只能存储字符信息。 RAW用来存储操作系统使用的原始二进制数据,可用于存储像图像或声音记录这样的信息,但这种数据长度最长度只有255字节。 LONGRAW与LONG类型等价,但存储二进制数据,最长可达2GB个字节。 31hr31hrBINARYINTEGER这个字段按计算器使用的二进制格式存储信息,从 2到21。 另: PLSQL提位两种复合类型:TABLE和RECORD 1。TABLE 要定义一个数组,你使用表类型定义语句,例如要定义Lastname数组,可以使用下述语句: typelastnamelististableofvarchar2(22) 当定义一个长类型时,就涉及到一个删除表的问题,PLSQL表不能用Delete语句来删除,但可以将每一行空值如下所示: saltab(3): 另一种法是定义两个相同类型的表类型,如果要将另一表清空,只需将空表给要清空的表即可。如下所示。 declare typenumtabtypeistableofnumber begin forIin1。。100loop saltab(I):I; 。 E 2。RECORD Declare Typedeptrectypeisrecord (deptnonumber(2), dnamechar(14), locchar(14),); begin selectdeptno,dname,locintodeptrecfromdeptwheredeptno30; 与所有的编程语言一样,定义一个变量时,同样存在变量作用范围问题: 如下所示: 变量x为实数类型 declare functionfunctionname(varianttype)returntypeis 在此范围内变量x为char类型 declare begin 变量x为实数类型 begin x:expression1 如果想引用另一block之变量时,可以加上blocklabel,如下所示: B outer declare begin declare 引用outerblock块定义之变量。 begin 。 Ifbirthdateouter。birthdatethen 。 E E E 三、PLSQL控制程序流 1。IFTHENELSIFELSE。ENDIF IFTHEN STATMENT1; elseifthen statment2 elseifthen statment3 ELSE STATMENT4; 例: outer forctrin1。。20loop inner forctrin1。。10loop ifouter。ctrctrthen 2。loopexitendloop loop 例: loop fetchc1into exitwhenc1 closec1; 另:加 例:outer loop loop exitouterwhen 3。whileloopendloop结构如下所示: 例 whiletotal25000loop 。 Selectsa1intosalaryfromempwhere Total: E 4。forloop 例1。 selectcount(empno) forLin1。。empcountloop 例2。 outer forstepin1。。25loop forstepin1。。10loop ifouter。step15then 5。cursor。loop declare sursorc1 namevarchar2(100); begin forpc1recinc1loop name:pc1rec。 四、存储过程 要创建存储过程,可以使用下面的SQL和PLSQL语句: CREATEORREPLACEPROCEDUREPROCEDURENAME(parameterlist) AS BEGIN (SQLANDPLSQLCOMMANDS) END; 五、存储函数 createorreplacefunctionfunctionname(parameterlist)returntypeis 。 Begin 六、Package Package分为两部分:SpecificandBody 在包说明部分中,主要将此包中所含的过程和Function的调用参数说明清楚,如: CREATEORREPLACEPACKAGEZDLJOBPKG AS PROCEDUREZDLINSERTJOB( pbkcidinnumber, pitemidinnumber, pjobnumberinoutvarchar2, pgroupidinnumber, pleaddayinnumber, ploadtypeinnumber, PSTATUSTYPEINNUMBER, PUSERIDINNUMBER, PJOBTYPEINVARCHAR2); PROCEDUREZDLUPDATEJOB( PBKCIDINNUMBER, PGROUPIDINNUMBER, PSTATUSTYPEINNUMBER, PUSERIDINNUMBER); FUNCTIONWIPMASSLOAD(PGROUPIDINNUMBER,PUSERIDINNUMBER)RETURNNUMBER; PROCEDUREZDLPREUPDATE; FUNCTIONZDLUPDATEORACLEWIP(PUSERIDINNUMBER)RETURNNUMBER; FUNCTIONZDLJOBSTATUS(PJOBNUMBERINVARCHAR2)RETURNNUMBER; ENDZDLJOBPKG; 在包体部分,主要将包说明部分之过程及Function之代码写出来, 如: CREATEORREPLACEPACKAGEBODYZDLJOBPKG AS PROCEDUREZDLINSERTJOB( pbkcidinnumber,pitemidinnumber,pjobnumberinoutvarchar2, pgroupidinnumber, pleaddayinnumber, PLOADTYPEINNUMBER, PSTATUSTYPEINNUMBER, PUSERIDINNUMBER, PJOBTYPEINVARCHAR2) is begin endZDLINSERTJOB; PROCEDUREZDLUPDATEJOB(PBKCIDINNUMBER,PGROUPIDINNUMBER,PSTATUSTYPEINNUMBER,PUSERIDINNUMBER) AS BEGIN ENDZDLUPDATEJOB; FUNCTIONWIPMASSLOAD(PGROUPIDINNUMBER,PUSERIDINNUMBER)RETURNNUMBER as begin ENDWIPMASSLOAD; PROCEDUREZDLPREUPDATEIS begin endZDLPREUPDATE; FUNCTIONZDLUPDATEORACLEWIP(PUSERIDINNUMBER)RETURNNUMBER IS begin endZDLUPDATEORACLEWIP; FUNCTIONZDLJOBSTATUS(PJOBNUMBERINVARCHAR2)RETURNNUMBER AS BEGIN ENDZDLJOBSTATUS; ENDZDLJOBPKG; 七、触发器 所需系统权限 要为某表创建触发器,必须能改变这个表,因此不仅要拥有表,并且要具有这个表的alter权限,或者具有alteranytable系统权限,除此之外,必须有createtriger系统权限,若要在另一个用户帐号(account)(也称之为模式(schema))上创建触发器,就必具有createanytrigger系统权限。 所需表权限 触发器可以引用的表并不是初始化触发事件的表。 触发器 触发器有十二种类型。一个触发器的类型由执行触发器的层次位置和触发事务的类型定义。 行级触发器 在某个事务中,行级触发器行执行,对于上述ledger表中记例子而言,触发器。行级触发器是在createtrigger命令中通过用foreachrow子句创建的。 合法的触发器类型 当两种不同类型之触发动作相结合时,有十二种可能的配置: Beforeinsert行级触发器 beforeinsert语句级触发器 afterinsert行级触发器 afterinsert语句级触发器 beforeupdate行级触发器 beforeupdate语句级触发器 afterupdate行级触发器 afterupdate语句级触发器 beforedelete行级触发器 beforedelete语句级触发器 afterdelete行级触发器 afterdelete语句级触发器 例: CREATEORREPLACETRIGGERAPPS。ZDLBKCJOBBODYAFI AFTERINSERTONAPPS。ZDLBKCJOBBODY REFERENCINGOLDASOLDNEWASNEWFOREACHROW BEGIN Insertintoaudittblvalues(:new。id,:new); UPDATEZDLBKCJOBHEADSETUPDATEDATESYSDATE WHEREZDLBKCJOBHEADID:NEW。ZDLBKCJOBBODYID; END;