• oracle程序包


    程序包

    概念:

           程序包是一种数据库对象,它是对相关的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 函数不允许读取包中的变量内容

     

     

     

            

  • 相关阅读:
    python死磕一之数据结构和基础库
    常见IO模型
    如何在WS系统的DOS命令台打印JAVA_HOME变量
    windows下安装elasticsearch
    Windows系统设置临时环境变量
    20181130一些关键词
    自动化测试之路
    根据IP获取IP定位
    Servlet(汇聚页)
    软件工具(汇聚页)
  • 原文地址:https://www.cnblogs.com/hjiongjiong/p/4231989.html
Copyright © 2020-2023  润新知