Oracle学习笔记第十六天

Oracle学习笔记第十六天

子程序

概念: 命名的PL/SQL块,编译并存储在数据库中

​ 把编写好的SQL程序取一个名称,并保存在数据库里面,可以通过这个名称来调用这段程序。

分类:

  1. 过程 – 执行某些操作

        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;

猜你喜欢

转载自blog.csdn.net/xxydzyr/article/details/85526819