ORACLE包创建笔记

--===============创建包示例1:============
----===========================================
----例1:创建的包为DEMO_PKG, 
--     该包中包含一个记录变量DEPTREC、两个函数和一个过程。
--     实现对dept表的增加、删除与查询。
CREATE OR REPLACE PACKAGE DEMO_PKG
  IS
    DEPTREC DEPT%ROWTYPE; 
    --Add dept...
    FUNCTION add_dept(dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)
    RETURN NUMBER; 
    --delete dept...
    FUNCTION delete_dept(dept_no NUMBER)
    RETURN NUMBER;
    --query dept...
    PROCEDURE query_dept(dept_no IN NUMBER);
END DEMO_PKG;

--第二步:包主体的创建方法,它实现上面所声明的包定义,
--并在包主体中声明一个私有变量flag和一个私有函数check_dept,
--由于在add_dept和remove_dept等函数中需要调用check_dpet函数,
--所以,在定义check_dept 函数之前首先对该函数进行声明,
--这种声明方法称作前向声明。
CREATE OR REPLACE PACKAGE BODY DEMO_PKG
IS 

  --函数add_dept的具体实现
  FUNCTION add_dept(dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)
  RETURN NUMBER
    IS 
      empno_remaining EXCEPTION; --自定义异常
      PRAGMA EXCEPTION_INIT(empno_remaining, -1);
             /* -1 是违反唯一约束条件的错误代码 */
      BEGIN
        INSERT INTO dept VALUES(dept_no, dept_name, location);
        IF SQL%FOUND THEN
           RETURN 1;
        END IF;
        EXCEPTION
          WHEN empno_remaining THEN 
               RETURN 0;
          WHEN OTHERS THEN
               RETURN -1;
      END add_dept;
  --函数delete_dept的具体实现
  FUNCTION delete_dept(dept_no NUMBER)
  RETURN NUMBER
    IS 
      BEGIN
        DELETE FROM dept WHERE deptno = dept_no;
        IF SQL%FOUND THEN
           RETURN 1;
        ELSE
            RETURN 0;
        END IF; 
        EXCEPTION
          WHEN OTHERS THEN
          RETURN -1;
      END delete_dept;
  --存储过程query_dept的具体实现
  PROCEDURE query_dept(dept_no IN NUMBER)
  IS
    BEGIN
      SELECT * INTO DeptRec FROM dept WHERE deptno=dept_no;
      EXCEPTION
        --NO_DATA_FOUND,TOO_MANY_ROWS属于oracle内置的自定义异常
        WHEN NO_DATA_FOUND THEN 
             DBMS_OUTPUT.PUT_LINE('温馨提示:数据库中没有编码为'||dept_no||'的部门');
        WHEN TOO_MANY_ROWS THEN
             DBMS_OUTPUT.PUT_LINE('程序运行错误,请使用游标进行操作!');
        WHEN OTHERS THEN
             DBMS_OUTPUT.PUT_LINE(SQLCODE||'----'||SQLERRM);
    END query_dept;
  
--BEGIN 
--   Null;
END DEMO_PKG;

---调用包文件
DECLARE
       var NUMBER;
BEGIN
  var := scott.DEMO_PKG.add_dept(90,'HKLORB', 'HAIKOU');
  IF var =-1 THEN
  --SQLCode:数据库操作的返回码,其中0--成功;-1--失败;100--没有检索到数据。
   --sqlerrm函数返回指定错误代码的错误信息。
     DBMS_OUTPUT.PUT_LINE(SQLCODE||'----'||SQLERRM);
  ELSIF var =0 THEN
        DBMS_OUTPUT.PUT_LINE('温馨提示:该部门记录已经存在!');
  ELSE
    DBMS_OUTPUT.PUT_LINE('温馨提示:添加记录成功!');
    scott.DEMO_PKG.query_dept(90);
    DBMS_OUTPUT.PUT_LINE(scott.DEMO_PKG.DeptRec.deptno||'---'||
    scott.DEMO_PKG.DeptRec.dname||'---'||scott.DEMO_PKG.DeptRec.loc);
    var := scott.DEMO_PKG.delete_dept(90);
    IF var =-1 THEN
       DBMS_OUTPUT.PUT_LINE(SQLCODE||'----'||SQLERRM);
    ELSIF var=0 THEN
          DBMS_OUTPUT.PUT_LINE('温馨提示:该部门记录不存在!');
    ELSE
        DBMS_OUTPUT.PUT_LINE('温馨提示:删除记录成功!');
    END IF;
  END IF;
END;

你可能感兴趣的:(oracle,存储过程,包)