一、創建存儲過程
存儲過程是在oracle中存取完成特定業務邏輯的代碼塊。存儲過程是命名塊,匿名塊不存在數據庫中,命名塊會存儲到數據庫中,匿名塊每次運行都需要提前編譯,命名塊一次存儲,只會編譯一次。命名塊可以多次使用。
創建存儲過程的語法:
create [or replace] procedure 存儲過程的名稱(參數名[in/out/inout] 參數類型,參數名...)]
is/as
變量聲明部分
begin
業務邏輯處理部分
exception
異常處理部分
end;
注意:
1、存儲過程名稱一般以pro_開頭。
2、存儲過程可以沒有參數,如果沒有參數不用加()。
3、過程的參數分三種,入參in出參out出入參inout如果不寫,默認是in。通過定義多個出參過程可以返回多個參數。
4、過程或者函數的參數定義類型的時候,不能有精度。
例子:使用plsql聲明一個存儲過程,傳一個員工編號的參數,返回員工的姓名和基本工資。
1 我們可以使用匿名塊調用存儲過程: 2 -- 創建存儲過程 輸入員工編號 返回員工姓名 基本工資 3 create or replace procedure pro_emp_test(v_empno number,v_ename 4 out varchar2,v_sal out number) 5 is 6 --變量聲明部分 7 begin 8 --業務邏輯處理部分 9 select ename ,sal into v_ename,v_sal from emp where empno=v_empno; 10 end;--匿名塊中調用存儲過程 11 declare 12 -- 聲明參數用來接收出參 13 v_ename emp.ename%type; 14 v_sal emp.sal%type; 15 begin 16 --調用存儲過程 17 pro_emp_test(7369,v_ename,v_sal); 18 -- 調用過程之后 v_ename 和v_sal就有值了 可以打印結果 19 dbms_output.put_line('員工姓名:'||v_ename||'員工基本工資:'||v_sal); 20 end;
二、創建函數
創建函數和過程非常類似
語法:
create [or replace] function 函數名[(參數名1[in/out/inout] 參數類型...)]
return 返回值的類型
as/is
變量聲明部分
begin
業務邏輯處理部分
return 變量/常量
exception
異常處理部分
end;
注意:同形參類型一樣,返回值類型不能有精度
例子:創建一個函數,返回0到10之間的一個隨機整數
1 調用函數一般使用匿名塊: 2 create or replace function fun_random return number 3 is 4 -- 聲明隨機數變量 5 v_num number(5); 6 begin 7 --獲取0到10之間的一個隨機數 8 v_num:=trunc(dbms_random.value(0,10)); 9 return v_num; 10 end; 11 --通過匿名塊調用函數 12 declare 13 -- 聲明變量接收函數的返回值 14 v_num number(5); 15 begin 16 -- 調用函數 17 v_num:=fun_random(); 18 --打印結果 19 dbms_output.put_line('隨機數:'||v_num); 20 end;
三、創建包
在開發中,如果業務邏輯比較復雜,需要定義很多過程或者函數。有可能需要定義幾十個過程或者函數,這些過程或者函數如果都放到一起,不好管理,一般使用包來管理過程或者函數,一個包中可以定義多個函數或者過程。
一個包包括包和包體,需要同時定義包和包體,這種寫法類似於java中的接口和接口的實現。包相當於接口,包體相當於接口的實現類。
創建包的語法:
create [or replace] package 包名 is
-- 聲明常量
-- 聲明函數或者過程,但是不能有實現
end;
創建包體的語法:
create [or replace ] package body 包名 is
-- 包的實現
end;
例子:定義包,計算圓的面積
定義包:
1 -- 定義包 計算圓的面積 2 create or replace package pac_area is 3 -- 定義pi常量 4 v_pi constant number(5,2):=3.14; 5 --定義計算圓的面積的過程,打印圓的面procedure pro_area(v_r number); 6 --定義一個獲取圓的面積的函數 7 function fun_area return number; 8 end;
創建包體:
1 -- 定義包體,用來實現包 2 create or replace package body pac_area is 3 --把面積參數定義成包體的成員變量,這樣函數也可以使用這個變量 4 v_area number(5,2); 5 -- 實現過程 6 procedure pro_area(v_r number) is 7 begin 8 v_area:=v_pi*v_r*v_r; 9 dbms_output.put_line('圓的面積是:'||v_area); 10 end; 11 --實現函數,注意,調用該函數前,一定要先調用過程 12 function fun_area return number ibegin 13 return v_area; 14 end; 15 end;調用包中的過程或者函數,在函數或者過程前加上包名就可以了: 16 --使用匿名塊調用包中的過程和函數 17 declare 18 v_area number(5,2); 19 begin 20 -- 調用打印圓的面積的過程 21 pac_area.pro_area(2); 22 -- 調用獲取圓的面積的函數 23 v_area :=pac_area.fun_area(); 24 dbms_output.put_line('函數計算的圓的面積是:'||v_area); 25 end;
四、管理 過程、函數、包
刪除:
drop procedure 過程名;
drop function 函數名;
drop package 包名;
查詢oracle中定義的包,函數,過程從user_source 表查找。
select * from user_source where type='PACKAGE BODY' and name = 'PAC_AREA';
五、面試題
一、過程和函數什么時候用
過程一般用於返回多個參數,函數一般用戶返回一個參數。
二、在pl/sql中 包的作用是什么
包的作用 封裝,方便管理過程和函數。