根据一份规范文档,写了一个用于日后项目开发的示例用途的存储过程。
这篇文档对数据库开发的初学者有帮助。严格执行的规范有利于程序代码的阅读和扩展。
规范
前缀 | 范例 | 说明 | |
数值型 | i_ | i_variablename | 用于number 、integer 等数值类型的变量。 |
字符型 | str_ | str_variablename | 用于char 、varchar2 等字符类型的变量。 |
日期型 | dt_ | dt_variablename | 用于date 、timestamp 等日期类型的变量。 |
BLOB | blb_ | blb_blobvariablename | 专用于BLOB 类型变量的定义。 |
CLOB | clb_ | clb_clobvariablename | 专用于CLOB 类型变量的定义。 |
LONG | lng_ | lng_longvariablename | 专用于LONG 类型变量的定义。 |
游标类型 | tcur_ | tcur_typename | t 表示类型(type ); cur 表示游标(cursor )。 |
游标 | cur_ | cur_cursorname | cur 表示游标(cursor ) |
自定义记录类型 | trcd _ | trcd_typename | t 表示类型(type ); rcd 表示记录(record )。 |
自定义记录类型变量 | vrcd_ | vrcd_variablename | v 表示变量(variable ); rcd 表示记录(record )。 |
自定义嵌套表类型 | tntbl_ | tntbl_typename | t 表示类型(type ); ntble 表示嵌套表(nested table )。 |
自定嵌套表类型变量 | vntbl_ | vntbl_variablename | v 表示变量(variable ); ntble 表示嵌套表(nested table )。 |
存储过程示例如下:
create or replace procedure p_rpt_test is
/**********************************************************************************
NAME: p_rpt_test
PURPOSE: 报表数据测试
REVISIONS:
Ver Date Author Description
--------- ---------- ---------------------- ------------------------------------
V1.0 2012-09-12 WangXL 12345 1.创建此存储过程
RETURN: 无返回值
NOTES: 1、使用到不带参数的游标(即cursor)
2、使用到for in loop end loop循环
3、游标打开后,必须关闭。
**********************************************************************************/
/*按照规划,定义number,string,date三种类型变量名称*/
i_id number(8);
str_testname varchar2(30);
dt_createdate date;
/*按照规划,定义cursor变量名称,游标是一个查询结果集,可以传入变量参数,也可以不传。
这里的结果集是test1表的三个字段*/
cursor cur_test1 is
select a.id, a.testname, a.createtime from test1 a;
begin
/* for in loop end loop 循环体 */
for c in cur_test1 loop
-- 该循环体中,游标自动打开关闭,不需要手工打开再关闭。
-- c 是循环内部变量,为了开发方便,所以简单命名为c。
-- c 根据循环,依次读取游标cur_test1的每一行记录。
--如果数据量很大,使用其他的方式取游标记录,如bulk collect into
i_id := c.id; --赋值游标中一行记录的id列值到i_id变量上
str_testname := c.testname || 'xx'; --将游标中一行记录的testname列值加上'xxx'处理后赋值到str_testname变量上
dt_createdate := c.createtime - 2;
insert into test2
(id, testname, createtime)
values
(i_id, str_testname, dt_createdate); --将变量值插入到test2表中
end loop;
commit; --所有记录插入后,一次性提交。
open cur_test1; --打开定义好的游标(cursor)
/*loop end loop循环体*/
loop
fetch cur_test1
into i_id, str_testname, dt_createdate;
--fetch就是取游标中一行记录到三个变量中
exit when cur_test1%notfound; --如果游标已经没有记录了,那么%notfound就是true,从而退出循环;如果还有记录继续下一步
str_testname := str_testname || 'yy'; --将游标中一行记录的testname列值加上'xxx'处理后赋值到str_testname变量上
dt_createdate := dt_createdate + 2;
insert into test2
(id, testname, createtime)
values
(i_id, str_testname, dt_createdate); --将变量值插入到test2表中
end loop;
commit; --所有记录插入后,一次性提交。
close cur_test1; --关闭开头打开的游标
exception
when others then
rollback; --如果上面操作失败,主动使用rollback取消所有的操作。
dbms_output.put_line(sqlerrm);
end;
存储过程展示两种循环体和游标的使用。