--=======PLSQL包=========
--首先我們來1個function , 1個procedure
create or replace function
f1(id in number) return number
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno = id;
return v_sal;
end;
create or replace procedure p1
(id in number ,v_sal out emp.sal%type)
is
begin
select sal into v_sal from emp where empno = id;
end;
-- ==ok ,現在調用上述的過程跟函數
declare
v_sal emp.sal%type;
begin
dbms_output.put_line(f1(7900)); --調用函數
p1(7900,v_sal); --調用過程
dbms_output.put_line('procedure v_sal emp.sal%type:'|| v_sal);
end;
--======把不同的相關對象存儲在一起,就要用到包.
--即表示 把上述的function ,procedure 合成一個
--包:包含兩部分
--聲明:用於定義包的公共組件,如函數頭,過程頭,遊標等以及常量,變量等。
-- 包頭中定義的公共組件可以在包內引用,也可以被其它子程序引用。
-- body 實現:用於定義包頭中定義過的過程和函數。可以單獨定義私有組件,
-----------包括變量,常量,過程和函數等。
-------私有組件只能在包內使用,而 不能被其它子程序所調用。
--對於應用來說 包聲明是一個可見的接口,對應用來說是可見的。
--包體是黑盒,對應用來說隱藏了實現的細節
--定義包頭
CREATE [OR REPLACE] PACKAGE package_name
{AS|IS}
public_variable_declarations | --公共變量
public_type_declarations | --公共類型
public_exception_declarations | --公共異常
public_cursor_declarations |--公共遊標
function_declarations | --函數聲明
procedure_specifications--過程聲明
END [package_name]
--定義包體,包體中的package_name應當與包頭中的package_name相同
CREATE [OR REPLACE] PACKAGE BODY package_name
{AS|IS}
private_variable_declarations |
private_type_declarations |
private_exception_declarations |
private_cursor_declarations |
function_declarations | --函數實現,調用1次執行1次
procedure_specifications --過程實現,調用1次執行1次
begin
初始化代碼 --首次調用包中的任意對象執行1次
END [package_name]
--=============使用包有哪些優點? =============
--1.將相關的函數和過程組織在一起
--2.在一個用戶環境內解決命名問題
--3.在不改變包聲明的前提下 可以改變包體的實現
--4.限制過程,函數的依賴性
--5.整個包的訪問權限只要1次授權
--6.區分私有過程,共有過程
--7.在包首次被調用時作爲一個整體讀入內存,減少多次調用時的磁盤I/O 次數
---------創建包頭
create or replace package pkg1
is
type t_rec is record( --聲明類型
n1 number ,
n2 varchar2(10)
);
v_rec t_rec; --定義公共變量
procedure proce1 ; --聲明過程
function fun1(p2 in number) return varchar2; --聲明函數
end;
--創建包體
create or replace package body pkg1
is
--過程實現
procedure proce1
is
begin
dbms_output.put_line('v_rec ' || v_rec.n1);
end;
--函數實現
function fun1(p2 in number ) return varchar2
is
begin
return v_rec.n2||p2;
end;
begin
v_rec.n1 :=100; --初始化在包頭聲明的變量
v_rec.n2 :='aaa';
end; --結束包體
--=================調用
declare
v_str varchar2(10); --接收function返回的結果
begin
v_str :=pkg1.fun1(10);--調用函數
dbms_output.put_line('v_str ' || v_str);
pkg1.proce1;--調用過程
end;
--查看包頭
select line,text from user_source where name='PKG1' and type='PACKAGE';
--查看包體
select line,text from user_source where name='PKG1' and type='PACKAGE BODY';
--刪除
drop package PKG1;