注意事项
1、存储过程参数不带取值范围,in表示传入,out表示输出,类型可以使用任意Oracle中的合法类型。
2、变量带取值范围,后面接分号
3、在判断语句前最好先用count(*)函数判断是否存在该条操作记录
4、用select [...] into[...],给变量赋值
5、在代码中抛异常用 raise+异常名
Oracle存储过程的基本语法
create [or replace] procedure 过程名
(
-- in表示输入,out表示输出
p1 in|out datatype,
p2 in|out datatype,
...
pn in|out datatype
) is
变量1 类型(值范围);
变量2 类型(值范围);....--声明部分
begin
....--过程体
end;
敝司将不同模块需要用到的存储过程放到对应的package中,因此,可以粗暴地将package理解为一个class,而procedure就是类对应的function,这样并不十分严谨,Oracle有它自己的Function,并且可以与procedure一起置于package下。
其中in表示入参,out就是出参或者说运行结果了。
在上面的“声明部分”,可以声明我们需要用到的变量及其类型和范围,变量可以是调用其他存储过程来赋值。
过程体就是具体的方法体实现,入参以及声明体中的变量可以在这个部分使用。
关于游标Cursor
Cursor可以用来作为一个中间TEMP值使用,依然可以在上述声明部分使用。例如这样一个场景,我们需要先行查询一个结果集,并对其中元素遍历,那么CURSOR结合LOOP体就十分有用,事实上敝司的CURSOR也是这么用的。
其语法如下:
-- 声明游标
declare cursor cursor_name(游标名)
is select_statement(查询语句);
--使用游标
open cursor_name;
--关闭游标 请注意使用完后一定要关闭
close cursor_name;
--从游标中获取数据
fetch cursor_name into v_record--变量
遍历CURSOR中数据的实例
open cur_xsjbxx;--打开游标
loop
FETCH cur_name
INTO ls_curinfo;--获取记录值
EXIT WHEN cur_name%NOTFOUND;
dbms_output.put_line('游标信息ID:' || ls_curinfo.id || ',名称:' ||
ls_curinfo.name);
end loop;
close cur_xsjbxx;--关闭游标
总结:
/**注意事项:
* 1、存储过程参数不带取值范围,in表示传入,out表示输出,类型可以使用任意Oracle中的合法类型。
* 2、变量带取值范围,后面接分号
* 3、在判断语句前最好先用count(*)函数判断是否存在该条操作记录
* 4、用select [...] into[...],给变量赋值
* 5、在代码中抛异常用 raise+异常名
*/
create [or replace] procedure 过程名
( p1 in|out datatype,
p2 in|out datatype,
...
pn in|out datatype
) is
-- 变量1 类型(值范围);
-- 变量2 类型(值范围);....--声明部分
vs_msg VARCHAR2(4000); --错误信息变量
--定义游标(简单的说就是一个可以遍历的结果集)
cursor cur_1 IS
select...
form...
where...;
begin
open cur_1;
loop
--从游标中获取数据
fetch cursor_name into v_record--变量
....--过程体
end loop;
close cur_1;
COMMIT;
Exception
when others then
DBMS_OUTPUT.put_line('sqlcode : ' || sqlcode);
DBMS_OUTPUT.put_line('sqlerrm : ' || sqlerrm);
rollback;
--异常处理
close cur_1;
end;