Oracle數據庫之PLSQL包

--=======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;
	

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章