Oracle学习笔记第十六天
子程序
概念: 命名的PL/SQL块,编译并存储在数据库中
把编写好的SQL程序取一个名称,并保存在数据库里面,可以通过这个名称来调用这段程序。
分类:
-
过程 – 执行某些操作
2. 函数 -- 执行操作并返回值
过程
-- 创建并执行过程的语法
CREATE [OR REPLACE] PROCEDURE
<procedure name> [(<parameter list>)] --过程名、过程参数
IS|AS
<local variable declaration> --声明变量
BEGIN
<executable statements> --执行部分
[EXCEPTION
<exception handlers>] --异常处理部分
END procedure name;
EXEC[UTE] procedure_name(parameters_list);--执行过程
`-- 举例
---创建存储过程
create or replace procedure
add_emp(v_empno emp.empno%type,
v_ename emp.ename%type,
v_job emp.job%type,
v_deptno emp.deptno%type
)
is
--定义异常变量
emp_null_error exception;
--将自定义的异常变量和系统的错误码绑定
pragma exception_init(emp_null_error,-1400);
begin
--插入数据
insert into emp(empno,ename,job,deptno)
values (v_empno,v_ename,v_job,v_deptno);
--提交事务
commit;
exception
when emp_null_error then
dbms_output.put_line('部门编号不能为空');
end add_emp;
-- 举例
------执行存储过程
-----方法一:打开命令窗口,输入命令
execute add_emp(123,'张小三','MANAGER',10);
-----方法二:在块中调用过程
set serveroutput on;
declare
begin
add_emp(124,'张小三','MANAGER',10);
end;
/
注意:异常可以不在子程序中执行,可以抛出,如果抛出的话有固定的输出格式,可以用 java 接收这个异常然后处理,灵活性好。
子程序传参可以按位置传参,也可以使用 参数名=> 值
过程的参数模式
1. IN
- 用于接受调用程序的值
- 默认的参数模式
2. OUT
- 用于向调用程序返回值
3. IN OUT
- 用于接受调用程序的值,并向调用程序返回更新的值
注意:存储过程使用入参时只需要指定变量类型,不能指定类型大小,否则会报错。
过程中使用游标
-- 语法 -- 存储过程使用游标类型的输出参数
----定义过程
create or replace procedure
过程名(游标名 out sys_refcursor)
is
begin
open 游标名 for SQL语句;
end;
----调用过程
set serveroutput on;
declare
游标名 sys_refcursor; --定义返回值的变量
数据变量名 emp.sal%type; --保存从游标中提取的数据
begin
过程名(游标名); -- 调用过程,传入游标进行数据的的读取
读取后的其他操作。
close 游标名; -- 关闭游标
end;
-- 语法 -- 存储过程使用游标类型的输入参数
----定义游标
create or replace procedure
过程名(游标名 in sys_refcursor)
is
保存数据变量 emp.sal%type; --保存从游标中提取的数据
begin
loop
fetch 游标名 into 变量; -- 从游标中读取数据
exit when 游标名%notfound; -- 判断游标里的值时候已经读取完
其他操作
end loop;
close 游标名; -- 关闭游标
end;
----调用游标
set serveroutput on;
declare
游标名 sys_refcursor;
begin
--打开游标
open 游标名 for SQL语句;
--调用过程
过程名(游标名); -- 调用过程,传入游标进行数据的的读取
end;
/
FETCH 表示提取游标,键学习笔记第十二天。
-- 提取游标
FETCH cursor_name INTO variable_list;
-- 使用FETCH语句实现对游标内容的读取
-- variable_list必须与从游标提取的结果集类型相同
跨账号执行存储过程
意思就是A执行B账号下的存储过程。
这个必须要执行授权,即在B中必须给A授权。
-- 在B用户中授权给A调用B创建的存储过程
grant execute on 存储过程名 to A用户;
grant execute on 存储过程名 to public;
-- 删除授权
DROP PROCEDURE procedure_name;