【Oracle】包及包的調用


1.概述

包用於將相關的對象組合在一起,一個任務,需要多個函數或者過程協同才能完成,這時,可以這些函數和存儲過程都放在一個包下,方便函數和存儲過程的管理,提高程序的性能,在第一次用的時候,會全部讀入內存,下次用直接從內存取,加強模塊化。

包分為兩部分:

1.包頭(類似java接口)
     包的規范,只包含了函數或存儲過程的說明部分
     創建包頭語法:
        create [or replace] package 包名 is|as
           --函數定義
           function 函數名 [(參數列表)] return 返回類型;
           --存儲過程定義
           procedure 存儲過程名 [(參數列表)];
        end [包名]; 
  2.包體(類似java實現類)
     實現包頭里定義的規范
     創建包體語法:
        create [or replace] package body 包名 is|as
           --函數實現
           function 函數名 [(參數列表)] return 返回類型 is|as
              函數實現內容
           --存儲過程實現
           procedure 存儲過程名 [(參數列表)] is|as
              存儲過程實現內容
        end [包名]; 

2.實戰演練

-- 建立包
create or replace package emp_pkg is
    TYPE t_ref_cursor is REF CURSOR;
    FUNCTION get_emp_ref_cussor RETURN t_ref_cursor;
    PROCEDURE update_emp_sal(
     e_empno  IN emp.empno%type,
     e_sal number
    );
end emp_pkg;

-- 建立包體
create or replace package body emp_pkg is

  FUNCTION get_emp_ref_cussor RETURN t_ref_cursor IS
    v_emp_ref_cursor t_ref_cursor;
  BEGIN
    OPEN v_emp_ref_cursor FOR
         SELECT empno, ename, sal 
         FROM emp; 
    RETURN v_emp_ref_cursor;
  END get_emp_ref_cussor;
  
  PROCEDURE update_emp_sal(
            e_empno  IN emp.empno%type,
            e_sal    IN NUMBER
            ) AS
  BEGIN
       UPDATE emp SET SAL = SAL/e_sal WHERE empno = e_empno;
       COMMIT;
  EXCEPTION
       WHEN OTHERS THEN
            DBMS_OUTPUT.put_line(SQLERRM);
       ROLLBACK;
  END update_emp_sal;
  
END emp_pkg;

2.1 調度包中函數

select emp_pkg.get_emp_ref_cussor from dual;

輸出結果截圖:

2.2 調度包中的過程

CALL emp_pkg.update_emp_sal(7369, 10000)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM