一、什么是存儲過程:
存儲過程(Stored Procedure )是一組為了完成特定功能的SQL 語句集,經編譯后存儲在數據庫中。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。
存儲過程是由流控制和SQL 語句書寫的過程,這個過程經編譯和優化后存儲在數據庫服務器中,應用程序使用時只要調用即可。在ORACLE 中,若干個有聯系的過程可以組合在一起構成程序包。其優點如下:
1. 存儲過程和函數以命名的數據庫對象形式存儲於數據庫當中。存儲在數據庫中的優點是很明顯的,因為代碼不保存在本地,用戶可以在任何客戶機上登錄到數據庫,並調用或修改代碼。
2. 存儲過程和函數可由數據庫提供安全保證,要想使用存儲過程和函數,需要有存儲過程和函數的所有者的授權,只有被授權的用戶或創建者本身才能執行存儲過程或調用函數。
3. 存儲過程和函數的信息是寫入數據字典的,所以存儲過程可以看作是一個公用模塊,用戶編寫的PL/SQL程序或其他存儲過程都可以調用它(但存儲過程和函數不能調用PL/SQL程序)。一個重復使用的功能,可以設計成為存儲過程。
4. 像其他高級語言的過程和函數一樣,可以傳遞參數給存儲過程或函數,參數的傳遞也有多種方式。存儲過程可以有返回值,也可以沒有返回值,存儲過程的返回值必須通過參數帶回;函數有一定的數據類型,像其他的標准函數一樣,我們可以通過對函數名的調用返回函數值。
5. 存儲過程和函數需要進行編譯,以排除語法錯誤,只有編譯通過才能調用。
二、 創建存儲過程:
create [or replace] procedure 存儲過程名 [(輸入、輸出參數、in/out模式參數)]
is/as
begin
sentences;
[exception
sentences;]
end 存儲過程名;
【例1】 一個沒有參數的存儲過程:
SQL>set serveroutput on
SQL> create or replace procedure pro_no_par is
2 begin
3 update emp set sal=sal+800 where id=3;
4 commit;
5 dbms_output.put_line('工資已經調整!!');
6 end pro_no_par;
7 /
SQL> execute pro_no_par;
工資已經調整!!
PL/SQL 過程已成功完成。
【例2】 一個帶in模式參數的存儲過程( 參數的方式有三種:指定名稱傳遞;按位置傳遞;混合方式傳遞)
SQL> set serveroutput on
SQL> create or replace procedure pro_in_par
2 (var_1 in nvarchar2,
3 var_2 in number) is
4 begin
5 update emp set sal=sal+var_2 where ename=var_1;
6 commit;
7 dbms_output.put_line(var_1 ||'的工資已經增加了'||var_2||'元!');
8 end pro_in_par;
9 /
SQL> execute pro_in_par('Smith',1500);
Smith的工資已經增加了1500元!
【例3】 一個帶out模式和in out模式參數存儲過程
SQL> create or replace procedure pro_out_par
2 (var_1 in out number,
3 var_2 out emp.ename%type,
4 var_3 out emp.sal%type) is
5 begin
6 select ename,sal into var_2,var_3 from emp where id=var_1;
7 end pro_out_par;
8 /
SQL>set serveroutput on
SQL>declare
2 ex_var_1 number;
3 ex_var_2 emp.ename%type;
4 ex_var_3 emp.sal%type;
5 begin
6 ex_var_1:=8;
7 pro_out_par(ex_var_1,ex_var_2,ex_var_3);
8 dbms_output.put_line('員工號為'||ex_var_1||'的員工姓名是:'||ex_var_2||'工資是:'||ex_var_3);
9 end;
10 /
員工號為8的員工姓名是:周瑜工資是:8500
三、存儲過程參數說明:三種形式的參數
1. IN 定義一個輸入參數變量,用於傳遞參數給存儲過程
2. OUT 定義一個輸出參數變量,用於從存儲過程獲取數據
3. IN OUT 定義一個輸入、輸出參數變量,兼有以上兩者的功能
四、 刪除存儲過程
DROP PROCEDURE 存儲過程名;
例如:
SQL> drop procedure pro_no_par;
過程已刪除。