11.oracle包详解

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

2.创建程序包的语法
  包头和包体名字一致
  程序包规范语法:
    --创建包定义:
    CREATE [OR REPLACE] PACKAGE 名字
    IS|AS
      变量、常量及数据类型定义;
      游标定义头部;
      函数、过程的定义和参数列表以及返回类型;
    end [包名];
    --创建包体:
    CREATE [OR REPLACE] PACKAGE BODY 包名
    is/as
      PROCEDURE 过程名(参数) is/as
      begin
        过程体;
      end [过程名];
      
      function 函数名(参数) return 类型 is/as
        begin
          函数体;
        end [函数名];
      end;
 程序实现
    --定义包头
    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;
调用:包名.元素名;
begin
   --dbms_output.put_line(pack1.bb); --报错
   dbms_output.put_line(pack1.AA);   --9
   dbms_output.put_line(pack1.FUN(1,2));--3   
end;
     
3.程序包中的游标
  游标的定义分为游标规范和游标主体两部分
  在包规范中声明游标规范时必须使用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
          v_emp emp%rowtype;
          begin
           open mycursor;
           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;
  --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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值