Oracle學習筆記第十八天
阿新 • • 發佈:2019-01-05
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] -- 編譯