oracle中的創建過程,函數,包


一、創建存儲過程

存儲過程是在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中 包的作用是什么

包的作用 封裝,方便管理過程和函數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM