1. 程式人生 > >Oracle學習筆記第十八天

Oracle學習筆記第十八天

Oracle學習筆記第十八天

概念: 程式包是對相關儲存過程、函式、變數、遊標和異常等物件的封裝,由規範和主體兩部分組成。

規範:宣告程式包中公共的物件,包括型別、變數、常量、異常、遊標規範和子程式規範等。

主體:宣告程式包私有物件和實現在包規範中宣告的子程式和遊標。

-- 語法
-- 包頭
CREATE [OR REPLACE]  PACKAGE   package_name 
IS|AS
[Public item declarations]  -- 變數、常量、遊標、資料型別宣告 --公共變數宣告
[Subprogram specification]   --子程式(過程、函式)宣告 
-- 類似java中的介面,這裡宣告子程式的入參和出參,但是並沒有詳細說明怎麼處理 END [package_name]; -- package name 可寫可不寫 -- 包體 CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS [Private item declarations] -- 定義私有變數,這個和java類似。 [Subprogram bodies] -- 這裡類似java的實現類,之前在包頭中定義的子程式,這裡寫具體怎麼實現。 [BEGIN Initialization] -- Oracle包的奇特之處,這裡是給包頭的公有變數賦值,這個位置在最後。
END [package_name]; -- package name 可寫可不寫
-- 示例
---建立包頭
create or replace package mypkg
is
    --定義公共變數
    v_minsal emp.sal%type;
    --定義遊標規範
    type my_cur_type is ref cursor;
    --定義過程規範
    procedure proc_emp(v_sals out my_cur_type); 
    --定義子程式規範
    function get_emp_sal(v_empno emp.empno%
type) return emp.sal%type; end mypkg; ---建立包體 create or replace package body mypkg is --定義私有變數 v_maxsal emp.sal%type; --定義子程式的主體 function get_emp_sal(v_empno emp.empno%type) return emp.sal%type is v_sal emp.sal%type; begin select e.sal into v_sal from emp e where e.empno = v_empno; --返回查詢結果 return v_sal; end; --定義過程的主體 procedure proc_emp(v_sals out my_cur_type) is begin open v_sals for select sal from emp; end; ---初始化公共變數 begin select min(sal) into v_minsal from emp; end mypkg; ------呼叫包中的函式 select mypkg.get_emp_sal(7788) from dual; ------呼叫包中的過程 set serveroutput on; declare v_sals mypkg.my_cur_type; --定義返回值的變數 v_sal emp.sal%type; --儲存從遊標中提取的資料 begin mypkg.proc_emp(v_sals); loop fetch v_sals into v_sal; exit when v_sals%notfound; dbms_output.put_line('工資:'||v_sal); end loop; close v_sals; end; /

程式包中的遊標

靜態遊標:

​ 遊標的定義分為遊標規範和遊標主體

​ 包規範中宣告遊標規範是必須使用return 子句指定遊標的返回型別。

動態遊標

​ 在包規範中宣告自定義遊標型別

**注意:不能在包主體中宣告遊標變數 **

程式包的管理

-- 語法
DROP   PACKAGE  [BODY]   package_name;-- 刪除程式包
ALTER  PACKAGE   package_name   COMPILE [PACKAGE|BODY] -- 編譯