oracle存储过程语法_第1页
oracle存储过程语法_第2页
oracle存储过程语法_第3页
oracle存储过程语法_第4页
oracle存储过程语法_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

存储过程存储过程 1 CREATE OR REPLACE PROCEDURE 存储过 程名 2 IS 3 BEGIN 4 NULL 5 END 行 1 CREATE OR REPLACE PROCEDURE 是一个 SQL 语句通知 Oracle 数据库去创建一个叫做 skeleton 存储过程 如果存在就覆盖它 行 2 IS 关键词表明后面将跟随一个 PL SQL 体 行 3 BEGIN 关键词表明 PL SQL 体的开始 行 4 NULL PL SQL 语句表明什么事都不做 这句不能删 去 因为 PL SQL 体中至少需要有一句 行 5 END 关键词表明 PL SQL 体的结束 存储过程创建语法 存储过程创建语法 create or replace procedure 存储过程名 param1 in type param2 out type as 变量 1 类型 值范围 vs msg VARCHAR2 4000 变量 2 类型 值范围 Begin Select count into 变量 1 from 表 A where 列名 param1 If 判断条件 then Select 列名 into 变量 2 from 表 A where 列名 param1 Dbms output Put line 打印信息 Elsif 判断条件 then Dbms output Put line 打印信息 Else Raise 异常名 NO DATA FOUND End if Exception When others then Rollback End 注意事项 1 存储过程参数不带取值范围 in 表示传入 out 表 示输出 类型可以使用任意 Oracle 中的合法类型 2 变量带取值范围 后面接分号 3 在判断语句前最好先用 count 函数判断是否 存在该条操作记录 4 用 select into 给变量赋值 5 在代码中抛异常用 raise 异常名 CREATE OR REPLACE PROCEDURE 存储过程名 定义参数 is ym IN CHAR 6 the count OUT NUMBER AS 定义变量 vs msg VARCHAR2 4000 错误信息变量 vs ym beg CHAR 6 起始月份 vs ym end CHAR 6 终止月份 vs ym sn beg CHAR 6 同期起始月份 vs ym sn end CHAR 6 同期终止月份 定义游标 简单的说就是一个可以遍历的结果集 CURSOR cur 1 IS SELECT FROM WHERE GROUP BY BEGIN 用输入参数给变量赋初值 用到了 Oralce 的 SUBSTR TO CHAR ADD MONTHS TO DATE 等很常用的函数 vs ym beg SUBSTR is ym 1 6 vs ym end SUBSTR is ym 7 6 vs ym sn beg TO CHAR ADD MONTHS TO DATE vs ym beg yyy ymm 12 yyyymm vs ym sn end TO CHAR ADD MONTHS TO DATE vs ym end yyy ymm 12 yyyymm 先删除表中特定条件的数据 DELETE FROM 表名 WHERE ym is ym 然后用内置的 DBMS OUTPUT 对象的 put line 方法 打印出影响的记录行数 其中用到一个系统变量 SQL rowcount DBMS OUTPUT put line del 上月记录 SQL rowcount 条 INSERT INTO 表名 area code ym CMCODE rmb amt usd amt SELECT area code is ym CMCODE SUM rmb amt 10000 SU M usd amt 10000 FROM BGD AREA CM M BASE T WHERE ym vs ym beg AND ym 0 then begin x 0 x end end if if x 0 then begin x 1 end end if end test 2 For 循环 For in LOOP 执行语句 end LOOP 1 循环遍历游标 create or replace procedure test as Cursor cursor is select name from student name varchar 20 begin for name in cursor LOOP begin dbms output putline name end end LOOP end test 2 循环遍历数组 create or replace procedure test varArray in myPackage TestArray as 输入参数 varArray 是自定义的数组类型 定义方式 见标题 6 i number begin i 1 存储过程数组是起始位置是从 1 开始的 与 java C C 等语言不同 因为在 Oracle 中本是没有 数组的概念的 数组其实就是一张 表 Table 每个数组元素就是表中的一个记录 所以 遍历数组时就相当于从表中的第一条记录开始遍历 for i in 1 varArray count LOOP dbms output putline The No i record in varArray is varArray i end LOOP end test 3 While 循环 while 条件语句 LOOP begin end end LOOP E g create or replace procedure test i in number as begin while i 10 LOOP begin i i 1 end end LOOP end test 4 数组 首先明确一个概念 Oracle 中本是没有数组的概念的 数组其实就是一张表 Table 每个数组元素就是表中的一个 记录 使用数组时 用户可以使用 Oracle 已经定义好的数组 类型 或可根据自己的需要定义数组类型 1 使用 Oracle 自带的数组类型 x array 使用时需要需要进行初始化 e g create or replace procedure test y out array is x array begin x new array y x end test 2 自定义的数组类型 自定义数据类型时 建议通过 创建 Package 的方式实现 以便于管理 create or replace package myPackage is Public type declarations type info is record name varchar 20 y number type TestArray is table of info index by binary integer 此处声明了一个 TestArray 的类型数据 其实其为一 张存储 Info 数据类型的 Table 而已 及 TestArray 就是一 张表 有两个字段 一个是 name 一个是 y 需要注意 的是此处使用了 Index by binary integer 编制该 Table 的 索引项 也可以不写 直接写成 type TestArray is table of info 如果不写的话使用数组时就需要进行初 始化 varArray myPackage TestArray varArray new myPackage TestArray end TestArray 5 游标的使用 Oracle 中 Cursor 是非常有用的 用于 遍历临时表中的查询结果 其相关方法和属性也很多 现 仅就常用的用法做一二介绍 1 Cursor 型游标 不能用于参数传递 create or replace procedure test is cusor 1 Cursor is select std name from student where Cursor 的使用方式 1 cursor 2 Cursor begin select class name into cursor 2 from class where Cursor 的使用方式 2 可使用 For x in cursor LOOP end LOOP 来实现对 Cursor 的遍历 end test 2 SYS REFCURSOR 型游标 该游标是 Oracle 以预 先定义的游标 可作出参数进行传递 create or replace procedure test rsCursor out SYS REFCURSOR is cursor SYS REFCURSOR name varhcar 20 begin OPEN cursor FOR select name from student where SYS REFCURSOR 只能通过 OPEN 方法来打开和赋值 LOOP fetch cursor into name SYS REFCURSOR 只能通 过 fetch into 来打开和遍历 exit when cursor NOTFOUND SYS REFCURSOR 中可 使用三个状态属性 NOTFOUND 未找到记录信息 FOUND 找到记录信 息 ROWCOUNT 然后当前 游标所指向的行位置 dbms output putline name end LOOP rsCursor cursor end test 实例 下面写一个简单的例子来对以上所说的存储过程的用法 做一个应用 现假设存在两张表 一张是学生成绩表 studnet 字段 为 stdId math article language music sport total average step 一张是学生课外成绩表 out school 字段为 stdId parctice comment 通过存储过程自动计算出每位学生的总成绩和平均成绩 同时 如果学生在课外课程中获得的评价为 A 就在总成 绩上加 20 分 create or replace procedure autocomputer step in number is rsCursor SYS REFCURSOR commentArray myPackage myArray math number article number language number music number sport number total number average number stdId varchar 30 record myPackage stdInfo i number begin i 1 get comment commentArray 调用名为 get comment 的存储过程获取学生课外评分信息 OPEN rsCursor for select stdId math article language music sport from student t where t step step LOOP fetch rsCursor into stdId math article language music sport exit when rsCursor NOTFOUND total math article language music sport for i in mentArray count LOOP record commentArray i if stdId record stdId then begin if ment A then begin total total 20 go to next 使用 go to 跳出 for 循环 end end if end end if end LOOP average total 5 update student t set t total total and t average average where t stdId stdId end LOOP end end autocomputer 取得学生评论信息的存储过程 create or replace procedure get comment commentArray out myPackage myArray is rs SYS REFCURSOR record myPackage stdInfo stdId varchar 30 comment varchar 1 i number begin open rs for select stdId comment from out school i 1 LOOP fetch rs into stdId comment exit when rs NOTF

温馨提示

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

评论

0/150

提交评论