Oracle学习笔记第十八天

Oracle学习笔记第十八天

概念: 程序包是对相关存储过程、函数、变量、游标和异常等对象的封装,由规范和主体两部分组成。

规范:声明程序包中公共的对象,包括类型、变量、常量、异常、游标规范和子程序规范等。

主体:声明程序包私有对象和实现在包规范中声明的子程序和游标。

-- 语法
-- 包头
CREATE [OR REPLACE]  PACKAGE   package_name 
IS|AS
[Public item declarations]  -- 变量、常量、游标、数据类型声明 --公共变量声明
[Subprogram specification]   --子程序(过程、函数)声明 
-- 类似java中的接口,这里声明子程序的入参和出参,但是并没有详细说明怎么处理
END [package_name]; -- package name 可写可不写

-- 包体
CREATE [OR REPLACE] PACKAGE BODY package_name 
IS|AS
[Private item declarations]  -- 定义私有变量,这个和java类似。
[Subprogram bodies]	-- 这里类似java的实现类,之前在包头中定义的子程序,这里写具体怎么实现。
[BEGIN	
Initialization]	-- Oracle包的奇特之处,这里是给包头的公有变量赋值,这个位置在最后。
END [package_name]; -- package name 可写可不写
-- 示例
---创建包头
create or replace package mypkg
is
    --定义公共变量
    v_minsal emp.sal%type;
    --定义游标规范
    type my_cur_type is ref cursor;
    --定义过程规范
    procedure proc_emp(v_sals out my_cur_type); 
    --定义子程序规范
    function get_emp_sal(v_empno emp.empno%type)
    return emp.sal%type;
end mypkg;

---创建包体
create or replace package body mypkg
is
    --定义私有变量
    v_maxsal emp.sal%type;
    
    --定义子程序的主体
    function get_emp_sal(v_empno emp.empno%type)
    return emp.sal%type
    is
       v_sal emp.sal%type;
    begin
       select e.sal into v_sal
       from emp e
       where e.empno = v_empno;

       --返回查询结果
       return v_sal;
    end;
    
    --定义过程的主体
    procedure proc_emp(v_sals out my_cur_type)
    is
    begin
       open v_sals for select sal from emp;
    end;  
    
    ---初始化公共变量
    begin
      select min(sal) into v_minsal from emp;
end mypkg;


------调用包中的函数
select mypkg.get_emp_sal(7788) from dual;

------调用包中的过程
set serveroutput on;
declare
   v_sals mypkg.my_cur_type; --定义返回值的变量
   v_sal emp.sal%type;   --保存从游标中提取的数据
begin
    mypkg.proc_emp(v_sals);
    
    loop
      fetch  v_sals into  v_sal;
      exit when v_sals%notfound;
      
      dbms_output.put_line('工资:'||v_sal);
    end loop; 
    
    close v_sals;
end;
/

程序包中的游标

静态游标:

​ 游标的定义分为游标规范和游标主体

​ 包规范中声明游标规范是必须使用return 子句指定游标的返回类型。

动态游标

​ 在包规范中声明自定义游标类型

**注意:不能在包主体中声明游标变量 **

程序包的管理

-- 语法
DROP   PACKAGE  [BODY]   package_name;-- 删除程序包
ALTER  PACKAGE   package_name   COMPILE [PACKAGE|BODY] -- 编译 

猜你喜欢

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