根据提供的文档信息,我们可以详细解析Oracle存储过程的相关知识点,包括其基本结构、语法以及示例中的具体用法。 ### Oracle存储过程概述 Oracle存储过程是一种在数据库中预先编译好的SQL与PL/SQL代码的集合,它可以在Oracle数据库中被多次调用执行,从而提高程序的运行效率和代码复用性。存储过程可以接受输入参数,同时也可以返回输出参数,甚至可以不带任何参数。存储过程支持复杂的控制流和错误处理机制,并且能够有效地管理数据库事务。 ### 基本语法结构 一个典型的Oracle存储过程的基本结构包括以下几个部分: 1. **创建存储过程**: - `CREATE OR REPLACE PROCEDURE 存储过程名称 (参数列表)`:用于声明一个新的存储过程或替换已有的同名存储过程。 - 其中`CREATE OR REPLACE`表示如果已有同名存储过程,则替换原有存储过程;如果没有,则创建新的存储过程。 2. **定义变量和常量**: - `AS`或`IS`:用于定义存储过程中使用的变量和常量等。 - 示例中的`vs_msg VARCHAR2(4000);`定义了一个名为`vs_msg`的变量,类型为`VARCHAR2`,长度为4000。 3. **执行语句**: - `BEGIN`:标记存储过程主体的开始。 - 在`BEGIN`和`END`之间的内容是存储过程的具体执行逻辑,可以包含各种PL/SQL语句,如变量赋值、条件判断、循环、异常处理等。 4. **结束语句**: - `END;`:标记存储过程主体的结束。 - 结束语句后的`/`表示执行该存储过程创建命令。 5. **异常处理**: - `EXCEPTION`:定义异常处理块,用于处理存储过程中可能发生的异常情况。 - `WHEN OTHERS THEN`:当发生未预期的异常时,会进入这个块进行处理。 ### 示例解析 文档中提供了两个存储过程示例,下面我们分别对这两个示例进行详细解析: #### 示例一 1. **参数声明**: - `create or replace procedure 示例名称 (param1 in 类型, param2 out 类型)` - 定义了一个名为“示例名称”的存储过程,其中`param1`为输入参数,类型为指定的类型;`param2`为输出参数,类型为指定的类型。 2. **查询与条件判断**: - `Select count(*) into 变量 from 表 where 条件;` - 使用`count(*)`统计表中满足条件的记录数量,并将结果存储到指定变量中。 - `IF (条件) THEN ... ELSEIF (条件) THEN ... ELSE ... END IF;` - 进行条件判断,根据不同的条件执行不同的操作。 3. **异常处理**: - `WHEN OTHERS THEN ROLLBACK;` - 当存储过程中出现其他未预期的异常时,回滚当前事务,以确保数据的一致性。 #### 示例二 1. **参数声明与变量定义**: - `create or replace procedure 示例名称 (is_ym in char(6), the_count out number)` - 定义了一个名为“示例名称”的存储过程,其中`is_ym`为输入参数,类型为`char(6)`;`the_count`为输出参数,类型为`number`。 - 定义了多个局部变量,例如`vs_ym_beg`、`vs_ym_end`等,用于存储日期相关的数据。 2. **查询与更新**: - 使用`SUBSTR`、`TO_CHAR`、`ADD_MONTHS`等函数处理日期,实现对日期的格式化和计算。 - 执行删除操作:`DELETE FROM 表 WHERE 条件;` - 执行插入操作:`INSERT INTO 表 (列名列表) SELECT (列名列表) FROM 表 WHERE 条件;` - 使用`CURSOR`定义游标,并通过`FOR`循环遍历游标结果,进行更新操作。 3. **异常处理与日志记录**: - 定义了异常处理块,用于捕获并处理存储过程中可能出现的各种异常。 - 使用`DBMS_OUTPUT.PUT_LINE`打印日志信息。 - 如果发生异常,则记录错误信息到日志表中。 以上就是关于Oracle存储过程的基础语法及其应用示例的详细解析。通过对这些知识点的理解和掌握,可以帮助开发人员更好地利用Oracle存储过程来优化应用程序的性能和功能。
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
存储过程 1 程名 2 3 4 5 IS BEGIN NULL; END; CREATE OR REPLACE PROCEDURE 存储过
行 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, 5, 用 select ……into……给变量赋值 在代码中抛异常用 raise+异常名
CREATE OR REPLACE PROCEDURE 存储过程名 ( --定义参数 is_ym IN CHAR(6) ,
the_count OUT NUMBER, ) AS --定义变量 vs_msg vs_ym_beg vs_ym_end VARCHAR2(4000); CHAR(6); 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 <= vs_ym_end GROUP BY area_code,CMCODE;
DBMS_OUTPUT.put_line('ins 当月记录 ='||SQL%rowcount||'条'); --遍历游标处理后更新到表. 遍历游标有几种方法, for 用 语句是其中比较直观的一种.
FOR rec IN cur_1 LOOP UPDATE 表名 SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn WHERE area_code = rec.area_code AND CMCODE = rec.CMCODE AND ym = is_ym;
END LOOP;
COMMIT;
--错误处理部分.OTHERS 表示除了声明外的任意错误. SQLERRM 是系统内置变量保存了当前错误的详细信息.
EXCEPTION
WHEN OTHERS THEN vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500 );
ROLLBACK;
- 粉丝: 7
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助