【Oracle】包及包的调用

1.概述

包用于将相关的对象组合在一起,一个任务,需要多个函数或者过程协同才能完成,这时,可以这些函数和存储过程都放在一个包下,方便函数和存储过程的管理,提高程序的性能,在第一次用的时候,会全部读入内存,下次用直接从内存取,加强模块化。

包分为两部分:

1.包头(类似java接口)
     包的规范,只包含了函数或存储过程的说明部分
     创建包头语法:
        create [or replace] package 包名 is|as
           --函数定义
           function 函数名 [(参数列表)] return 返回类型;
           --存储过程定义
           procedure 存储过程名 [(参数列表)];
        end [包名]; 
  2.包体(类似java实现类)
     实现包头里定义的规范
     创建包体语法:
        create [or replace] package body 包名 is|as
           --函数实现
           function 函数名 [(参数列表)] return 返回类型 is|as
              函数实现内容
           --存储过程实现
           procedure 存储过程名 [(参数列表)] is|as
              存储过程实现内容
        end [包名]; 

2.实战演练

-- 建立包
create or replace package emp_pkg is
    TYPE t_ref_cursor is REF CURSOR;
    FUNCTION get_emp_ref_cussor RETURN t_ref_cursor;
    PROCEDURE update_emp_sal(
     e_empno  IN emp.empno%type,
     e_sal number
    );
end emp_pkg;

-- 建立包体
create or replace package body emp_pkg is

  FUNCTION get_emp_ref_cussor RETURN t_ref_cursor IS
    v_emp_ref_cursor t_ref_cursor;
  BEGIN
    OPEN v_emp_ref_cursor FOR
         SELECT empno, ename, sal 
         FROM emp; 
    RETURN v_emp_ref_cursor;
  END get_emp_ref_cussor;
  
  PROCEDURE update_emp_sal(
            e_empno  IN emp.empno%type,
            e_sal    IN NUMBER
            ) AS
  BEGIN
       UPDATE emp SET SAL = SAL/e_sal WHERE empno = e_empno;
       COMMIT;
  EXCEPTION
       WHEN OTHERS THEN
            DBMS_OUTPUT.put_line(SQLERRM);
       ROLLBACK;
  END update_emp_sal;
  
END emp_pkg;

2.1 调度包中函数

select emp_pkg.get_emp_ref_cussor from dual;

输出结果截图:
【Oracle】包及包的调用

2.2 调度包中的过程

CALL emp_pkg.update_emp_sal(7369, 10000)

【Oracle】包及包的调用

上一篇:MySQL运行状态show status详解


下一篇:《MySQL性能优化和高可用架构实践》于2020-07-01上市