PLSQL程序包

1.程序包

程序包是对相关过程、函数、变量、游标和异常等对象的封装,由规范(包头)和主体(包体)两部分组成。规范中可以声明程序包中公共对象,包括类型、变量、常量、异常、游标规范和子程序规范等。主体中可以声明程序包私有对象和实现在包规范中声明的子程序和游标。

--程序包规范语法
CREATE [OR REPLACE] PACKAGE 名字 IS|AS
[Public item declarations]
[Subprogram specification]
END [package_name];
    package_name:包的名称
    Public item declarations:公共声明部分
    Subprogram specification:声明PL/SQL子程序
​
--程序包主体
CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS
[Private item declarations] 
[Subprogram bodies] 
[BEGIN
Initialization]
END [package_name];
    package_name是包的名称
    public type and item declarations::私有声明部分
    subprogram specificatons:子程序体
​
--定义包头
create or replace package pack1
is
   aa number := 9;
   procedure insert_dept(v_dept in dept%rowtype);
   function fun(v1 number,v2 number) return number;
end;
--包体实现
create or replace package body pack1
is
    bb number := 10;
    procedure insert_dept(v_dept in dept%rowtype)
    is
    begin
        insert into dept values(v_dept.deptno,v_dept.dname,v_dept.loc);
    end;
    function fun(v1 number,v2 number) return number
    is
    begin
        return v1 + v2;
    end;
end;

程序包中游标的定义分为游标规范和游标主体两部分,在包规范中声明游标规范时必须使用 RETURN 子句指定游标的返回类型 return 数据类型;RETURN子句指定的数据类型可以是:%ROWTYPE 属性引用表定义的记录类型,程序员定义的记录类型,例如 TYPE EMPRECTYP IS RECORD(emp_id INTEGER,salary REAL) 来定义的,不可以是number, varchar2, %TYPE等类型。

--显示游标
create or replace package pack2
is
    cursor mycursor return emp%rowtype;
    procedure mycursor_use;
end;
create or replace package body pack2
is
    cursor mycursor return emp%rowtype is select * from emp
    procedure mycursor_use
    is
    begin
        for i in mycursor loop
            dbms_output.put_line(i.ename)
        end loop;
    end;
end;
​
--REF游标
create or replace package pack3
is
    type refcur is ref cursor;
    procedure mycursor_use;
end;
create or replace package body pack3
is
    procedure mycursor_use
    is
        mycursor refcur;
        v_emp emp%rowtype;
    begin
        open mycursor for select * from emp;
        fetch mycursor into v_emp;
        while mycursor%found loop
            dbms_output.put_line(v_emp.ename);
            fetch mycursor into v_emp;
        end loop;
        close mycursor;
    end;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特亿安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值