oracle程序包

倾然丶 夕夏残阳落幕 提交于 2020-02-08 06:03:35

程序包

概念:

       程序包是一种数据库对象,它是对相关的pl/sql类型,子程序,游标,异常,变量和常量的封装。分为2部分。1是程序包规范2是程序包主题。

程序包规范:

       声明包内数据类型,变量,常量,游标,子程序和异常等元素,这些元素为程序包的公有元素

      语法

          CREATE [OR REPLACE] PACKAGE package_name

          {IS | AS}

           [公有数据类型定义[公有数据类型定义]。。。。。]                    ---无需程序包主体实现     

           [共有游标的声明 [公有游标的声明]。。。。。。]                     - --需要程序包主体具体实现

           [公有子程序的声明[公有子程序的声明]。。。。。]                    ---需要程序包主体具体实现

           END [ package_name ];

            (在程序包规范内声明的项可以在程序包之外使用,所以称为公用对象)

       ---------------------示例一创建程序包规范------------------------------

CREATE  OR  REPLACE  PACKAGE  pack_me  
IS 
PROCEDURE  emp_proc(num NUMBER );                   --声明存储过程
FUNCTION  emp_fun(empno NUMBER) RETURN  VARCHAR2;   --声明函数
END pack_me;   

 

程序包的主体:

       包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在程序包主题中还可以声明包的私有元素。

   语法:

     CREATE [OR REPLACE ] PACKAGE BODY package_name

      {IS | AS}

         [私有数据类型定义[私有数据类型定义]。。。。]

         [私有变量和常量,异常的声明[私有变量和常量,异常的声明]。。。]

         [私有的子程序和游标声明和定义[私有的子程序和游标声明和定义]。。。。]

         [共有的游标和子程序的定义[共有的游标和子程序的定义]。。。]

     BEGIN

         执行部分(初始化部分)          ----可用于初始化程序包中的变量,不能调用程序包也不能传参给程序包,只执行一次。

     END package_name;

   

 ---------------------示例二创建程序包主体------------------------------

 

CREATE OR REPLACE BODY pack_me AS--实现规范部分声明的存储过程
  PROCEDURE emp_prco(NUM NUMBER) IS
    e_mail VARCHAR2(50);
    BEGIN
      SELECT t.e_mail INTO e_mail FROM employees t
      WHERE t.id=NUM;
      dbms_output.put_line(e_mail);
      END emp_prco;  --实现规范部分声明的函数
    FUNCTION emp_fun(empno NUMBER) RETURN VARCHAR2 IS
      emp_name VARCHAR2(20);
      BEGIN
        SELECT t.name INTO emp_name FROM employees t
      WHERE t.id=empno;
      RETURN em_name;
      END emp_fun;--关闭程序包主体部分
      END pack_me;

 

调用程序包:

   语法:程序包名.[子程序名|游标名|变量名。。等]

 ---------------------示例三调用程序包------------------------------

DECLARE 
v_name VARCHAR2(20);
v_num NUMBER;
BEGIN
  v_num :=#           --接受用户输入数字编号
  pack_me.emp_proc(v_num);
  v_name :=pack_me.emp_fun(v_num);  --变量接受函数返回值
  dbms_output.put_line(v_name);
  
  END;

其他程序包的操作

查询包

--查询user_objects数据字典确认包规范及包体
SELECT object_type,object_name,status FROM User_Objects WHERE object_type IN('PACKAGE','PACKAGE BODY');

 

--查询包的内容
SELECT * FROM user_source WHERE TYPE='PACKAGE' AND NAME='GETEMP_PKG';

删除包
       删除包规范

DROP PACKAGE 包名称

删除包体

DROP PACKAGE BODY包名称

删除包规范里会对其对应的包体一起删除

 包的重新编译

ALTER PACKAGE 包名称 COMPILE PACKAGE;
--示例
ALTER PACKAGE GETEMP_PKG COMPILE PACKAGE;

 包的纯度级别

语法:
PRAGMA restrict_references(函数名,WNDS[,WNPS][,RNDS][,RUPS])

NO 纯度等级 说明
1 WNDS 函数不能悠数据库表数据(无法使用DML更新)
2 RNDS 函数不能读数据库表(无法使用SELECT查询)
3 WNPS 函数不允许悠包中的变量内容
4 RNPS 函数不允许读取包中的变量内容

 

 

 

 

 

 

 

 

 

        

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!