zoukankan      html  css  js  c++  java
  • 程序包(学习笔记)

    示例一、根据输入的部门编号找到这个部门的所有员工

    首先创建包,定义包规范

    create or replace package getemp_pkg is
    
      FUNCTION getemp_fun(p_dno dept.deptno%type) RETURN SYS_REFCURSOR; --返回弱类型游标
      
    
    end getemp_pkg;

    执行后自动生成包的主体

    定义包的主体(实现体)

    create or replace package body getemp_pkg 
    AS
    FUNCTION getemp_fun(p_dno dept.deptno%TYPE) 
    RETURN SYS_REFCURSOR                --返回弱类型游标
    AS
    cur_emp   SYS_REFCURSOR;
    begin
       OPEN cur_emp FOR SELECT * FROM emp WHERE deptno=p_dno;          --打开游标
       RETURN cur_emp;             --返回游标
       END getemp_fun;
    end getemp_pkg;

    调用包

    DECLARE
      V_EMP   EMP%ROWTYPE;                   --定义变量来接收游标的内容
      CUR_EMP SYS_REFCURSOR;                --定义游标来接收返回游标
      V_DNO   DEPT.DEPTNO%TYPE;                --定义部门编号,转入参数
    BEGIN
      CUR_EMP := GETEMP_PKG.GETEMP_FUN(&V_DNO);
      LOOP
        FETCH CUR_EMP                                       --提取游标
          INTO V_EMP;
        EXIT WHEN CUR_EMP%NOTFOUND;                  --退出条件
        DBMS_OUTPUT.PUT_LINE(CUR_EMP%ROWCOUNT || ' 员工编号:' || V_EMP.EMPNO ||
                             ' 姓名:' || V_EMP.ENAME);
      END LOOP;
      CLOSE cur_emp;                                    --关闭游标
    END;

     

    示例二、包中有过程和函数

    程序包规范

    create or replace package pack_me is
    
    PROCEDURE emp_proc(num NUMBER);
    FUNCTION emp_fun(eno NUMBER) RETURN VARCHAR2;
    
    end pack_me;

    程序包主体

    create or replace package body pack_me is
    
    PROCEDURE emp_proc(num NUMBER) IS
      v_name     VARCHAR2(50);
      BEGIN
        SELECT ename INTO v_name FROM emp WHERE empno=num;
        dbms_output.put_line('员工编号:'||num||' 的姓名:'||v_name);
      END emp_proc;
      FUNCTION  emp_fun(eno NUMBER) RETURN VARCHAR2
        AS
        v_job          varchar2(50);
        BEGIN
           SELECT job INTO v_job FROM emp WHERE empno=eno;
           RETURN v_job;
        --dbms_output.put_line('员工编号:'||empno||' 的职位:'||v_job);
        END emp_fun;
    
    end pack_me;

    执行

    --程序包
    DECLARE
       v_empno             emp.empno%TYPE:=&empno;
       v_job           Varchar2(50);
    BEGIN
      pack_me.emp_proc(v_empno);
      v_job:=pack_me.emp_fun(v_empno);
    dbms_output.put_line('员工编号:'||v_empno||' 的职位:'||v_job);
    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 函数不允许读取包中的变量内容
  • 相关阅读:
    perl next和last
    用 Flask 来写个轻博客 (26) — 使用 Flask-Celery-Helper 实现异步任务
    mysql 更新唯一主键列 被堵塞
    perl + 匹配前导模式一次或者多次
    跨域
    日志处理
    FineBI:一个简单易用的自助BI工具
    FineBI:一个简单易用的自助BI工具
    bootstrap-treeview
    Bootstrap树形菜单插件TreeView.js使用方法详解
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4216066.html
Copyright © 2011-2022 走看看