oracle存储过程语法_第1页
oracle存储过程语法_第2页
oracle存储过程语法_第3页
oracle存储过程语法_第4页
oracle存储过程语法_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、存储过程1CREATEORREPLACEPROCEDURE 存储过程名2|lS3BEGIN4NULL;5END;行 1:CREATEORREPLACEPROCEDURE 是一个SQL 语句通知 Oracle 数据库去创建一个叫做 skeleton 存储过程,如果存在就覆盖它;行 2:IS 关键词表明后面将跟随一个 PL/SQL 体。行 3:BEGIN 关键词表明 PL/SQL 体的开始。行 4:NULLPL/SQL 语句表明什么事都不做,这句不能删去,因为PL/SQL 体中至少需要有一句;行 5:END 关键词表明 PL/SQL 体的结束createorreplaceprocedure 存储过

2、程名(paramlintype,param2outtype)as变量 1 类型(值范围);-vs_msgVARCHAR2(4000);变量 2 类型(值范围);BeginSelectcount(*)into 变量 1from 表 Awhere 列名=param1;If(判断条件)thenSelect 列名 into 变量 2from 表 Awhere 列名=param1;Dbms_outputoPut_line(打印信息);Elsif(判断条件)thenDbms_outputoPut_line(打印信息);ElseRaise 异常名(NO_DATA_FOUND);Endif;Exception

3、WhenothersthenRollback;End;注意事项:1,存储过程参数不带取值范围,in 表示传入,out 表示输由类型可以使用任意 Oracle 中的合法类型。2,变量带取值范围,后面接分号3,在判断语句前最好先用 count(*)函数判断是否存在该条操作记录4,用 select。into。给变量赋值5,在代码中抛异常用 raise+异常名CREATEORREPLACEPROCEDURE 存储过程名(-定义参数is_ymINCHAR(6),the_countOUTNUMBER,)AS-定义变量vs_msgVARCHAR2(4000);-错误信息变量vs_ym_begCHAR(6);

4、-起始月份vs_ym_endCHAR(6);-终止月份vs_ym_sn_begCHAR(6);-同期起始月份vs_ym_sn_endCHAR(6);-同期终止月份-定义游标(简单的说就是一个可以遍历的结果集)CURSORcur_1ISSELECT。FROMWHERE。GROUPBY;BEGIN-用输入参数给变量赋初值,用到了 Oralce 的 SUBSTRTO_CHARADD_MONTHSTO_DATE 等很常用的函数。vs_ym_beg:=SUBSTR(is_ym,1,6);vs_ym_end:=SUBSTR(is_ym,7,6);vs_ym_sn_beg:=TO_CHAR(ADD_MONT

5、HS(TO_DATE(vs_ym_beg,yyyymm),-12),yyyymm);vs_ym_sn_end:=TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,yyyymm),-12),yyyymm);-先删除表中特定条件的数据。DELETEFROM 表名 WHEREym=is_ym;-然后用内置的 DBMS_OUTPUT对象的 put_line方法打印由影响的记录行数,其中用到一个系统变量 SQL%rowcountDBMSOUTPUT.putline(del 上月记录=|SQL%rowcount|条);INSERTINTO 表名(area_code,ym,CMCOD

6、E,rmb_amt,usd_amt)SELECTarea_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000FROMBGD_AREA_CM_M_BASE_TWHEREym=vs_ym_begANDym0thenbeginx:=0-x;end;endif;ifx=0thenbeginx:=1;end;endif;endtest;2、For 循环For.in.LOOP-执行语句endLOOP;(1)循环遍历游标createorreplaceproceduretest()asCursorcursorisselectnamefromstude

7、nt;namevarchar(20);beginfornameincursorLOOPbegindbms_output.putline(name);end;endLOOP;endtest;(2)循环遍历数组createorreplaceproceduretest(varArrayinmyPackage.TestArray)as-(输入参数 varArray 是自定义的数组类型,定义方式见标题 6)inumber;begini:=1;-存储过程数组是起始位置是从 1 开始的,与 java、C、C+等语言不同。因为在 Oracle 中本是没有数组的概念的,数组其实就是一张-表(Table),每个数

8、组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历foriin1.varArray.countLOOPdbms_output.putline('TheNo.'|i|'recordinvarArrayis:'|varArray(i);endLOOP;endtest;3、While 循环while 条件语句 LOOPbeginend;endLOOP;E.gcreateorreplaceproceduretest(iinnumber)asbeginwhilei10LOOPbegini:=i+1;end;e

9、ndLOOP;endtest;首先明确一个概念:Oracle 中本是没有数组的概念的,数组其实就是一张表(Table),每个数组元素就是表中的一个记录。使用数组时,用户可以使用 Oracle 已经定义好的数组类型,或可根据自己的需要定义数组类型。(1)使用 Oracle 自带的数组类型xarray;-使用时需要需要进行初始化e.g:createorreplaceproceduretest(youtarray)isxarray;beginx:=newarray();y:=x;endtest;(2)自定义的数组类型(自定义数据类型时,建议通过创建 Package 的方式实现,以便于管理)creat

10、eorreplacepackagemyPackageisPublictypedeclarationstypeinfoisrecord(namevarchar(20),ynumber);typeTestArrayistableofinfoindexbybinary_integer;-此处声明了一个 TestArray 的类型数据,其实其为一张存储Info 数据类型的 Table 而已,及 TestArray 就是一张表,有两个字段 , 一 个 是 name, 一 个 是 y。需 要 注 意 的 是 此 处 使 用 了Indexbybinary_integer 编制该 Table 的索引项,也可以

11、不写,直接写成:typeTestArrayistableofinfo,如果不写的话使用数组时就需要进行初始化:varArraymyPackage.TestArray;varArray:=newmyPackage.TestArray();endTestArray;5.游标的使用 Oracle 中 Cursor 是非常有用的,用于遍历临时表中的查询结果。其相关方法和属性也很多,现仅就常用的用法做一二介绍:(1)Cursor 型游标(不能用于参数传递)createorreplaceproceduretest()iscusor_1Cursorisselectstd_namefromstudentwhe

12、re.;-Cursor 的使用方式 1cursor_2Cursor;beginselectclass_nameintocursor_2fromclasswhere.;-Cursor 的使用方式 2可使用 ForxincursorLOOP.endLOOP;来实现对Cursor 的遍历endtest;(2)SYS_REFCURSOR 型游标,该游标是 Oracle 以预先定义的游标,可作由参数进行传递createorreplaceproceduretest(rsCursoroutSYS_REFCURSOR)iscursorSYS_REFCURSOR;namevarhcar(20);beginOPE

13、NcursorFORselectnamefromstudentwhere.-SYS_REFCURSOR 只能通过 OPEN 方法来打开和赋值LOOPfetchcursorintoname-SYS_REFCURSOR 只能通过 fetchinto来打开和遍历 exitwhencursor%NOTFOUND;-SYS_REFCURSOR 中可使用三个状态属性:-%NOTFOUND(未找至 U 记录信息)%FOUND(找到记录信息)-%ROWCOUNT(然后当前游标所指向的行位置)dbms_output.putline(name);endLOOP;rsCursor:=cursor;endtest;实

14、例下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:现假设存在两张表,一张是学生成绩表(studnet),字段为:stdId,math,article,language,music,sport,total,average,step一张是学生课外成绩表(out_school),字段为:stdId,parctice,comment通过存储过程自动计算由每位学生的总成绩和平均成绩,同时,如果学生在课外课程中获得的评价为 A,就在总成绩上加 20 分。createorreplaceprocedureautocomputer(stepinnumber)isrsCursorSYS_REFCURS

15、OR;commentArraymyPackage.myArray;mathnumber;articlenumber;languagenumber;musicnumber;sportnumber;totalnumber;averagenumber;stdIdvarchar(30);recordmyPackage.stdInfo;inumber;begini:=1;etcomment(commentArray);get_comment()的存储过程获取学生课外评分信息OPENrsCursorforselectstdId,math,article,language,music,sportfromst

16、udenttwheret.step=step;LOOPfetchrsCursorinto调用名为stdId,math,article,language,music,sport;exitwhenrsCursor%NOTFOUND;total:=math+article+language+music+sport;mentArray.countLOOPrecord:=commentArray(i);ifstdId=record.stdIment='A'thenbegintotal:=total+20;gotonext;-使用 goto 跳由 for 循环end;e

17、ndif;end;endif;endLOOP;average:=total/5;updatestudenttsett.total=totalandt.average=averagewheret.stdId=stdId;endLOOP;end;endautocomputer;-取得学生评论信息的存储过程createorreplaceprocedureget_comment(commentArrayoutmyPackage.myArray)isrsSYS_REFCURSOR;recordmyPackage.stdInfo;stdIdvarchar(30);commentvarchar(1);inumber;beginopenrsforselectstdId,commentfromout_schooli:=1;LOOPfetchrsintostdId,comment;exitwhenrs%NO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论