工作中遇到了Oracle的存储过程,学习下Oracle存储过程
创建procedure基本语句:
CREATE [ OR REPLACE ] PROCEDURE [ schema.]procedure
[(argument [IN | OUT | IN OUT ] [NO COPY] datatype
[, argument [IN | OUT | IN OUT ] [NO COPY] datatype]...
)]
[ authid { current_user | definer }]
{ is | as } { pl/sql_subprogram_body |
language { java name 'String' | c [ name, name] library lib_name
}]
其中,IN,OUT,IN OUT用来修饰参数
IN表示这个变量必须被调用者赋值然后进行处理
OUT表示通过这个变量将值返回给调用者
IN OUT是两者的组合
authid代表两种权限:
定义者权限,执行者权限。
定义者权限表示这个procedure涉及的表,视图等对象所需要的权限只要定义者拥有权限的话就可以访问。
执行者权限表示需要调用这个procedure的用户要拥有相关表和对象的权限。
oracle存储过程的基本结构:
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) AS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
......
END 存储过程名字
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
BEGIN
SELECT CUST_TYPE INTO v_cust_type FROM tablename WHERE 条件;
EXCEPTION
WHEN NO_DATA_FOUND THEN
......
WHEN OTHERS THEN
......
END;
注:在存储过程中,select某一个字段时,后面必须紧跟into。
在利用select ... into ...时,必须先确保数据中有该条记录,否则会报no data found异常。
关于游标
显式游标的定义:CURSOR cursor_name IS select_statement
例如:
CURSOR cur_post_info
IS
SELECT A.参数,B.参数
FROM tablename A,tablename B
WHERE 条件 ;
OPEN cur_post_info;--打开游标
--循环游标
LOOP FETCH cur_post_info INTO 参数1,参数2
EXIT WHEN cur_post_info%NOTFOUND;--当没有记录时推出循环
......
END LOOP;
CLOSE cur_post_info;
有显式游标相应的就有隐式游标,隐式游标的好处就是不需要手动关闭,在这里不做介绍了。