1.概述
存儲過程也是一種PL/SQL塊,是存入數據庫的PL/SQL塊。
但存儲過程不同於已經普通的PL/SQL程序,我們通常把PL/SQL程序稱爲無名塊,而存儲過程是以命名的方式存儲於數據庫中的。
因此,我們可以這樣理解,爲PLSQL程序塊起個名字,不用每次都編譯,可以直接調用,就是存儲過程。
2.存儲過程優點
和PL/SQL程序相比,存儲過程有很多優點,具體歸納:
1. 與數據庫關聯。存儲過程的代碼保存在數據庫中而非本地,用戶可在任何登陸的客戶機上調用修改該存儲過程。
2. 代碼複用性。存儲過程的信息寫入數據字典,因此是一個公用模塊,我們可以通過兩外的存儲過程和函數調用已經存在的存儲過程。
但是,存儲過程不能調用PLSQL程序塊。
3. 存儲過程支持傳遞參數,並支持返回值。
4. 存儲過程需要進行編譯。編譯不通過仍然可以創建,但是通過PLSQL developer等工具會有警告。
5. 安全性。存儲過程可由數據庫提供安全保證,要想使用存儲過程,需要有存儲過程和函數的所有者的授權,只有被授權的用戶或創建者本身才能執行存儲過程或調用函數。
3.創建存儲過程
存儲過程create or replace procedure p is
相當於PLSQL中的declare,其餘都和PLSQL基本一致。
CREATE [OR REPLACE] PROCEDURE 存儲過程名[(參數[IN|OUT|IN OUT] 數據類型...)]
{AS|IS}
[說明部分]
BEGIN
可執行部分
[EXCEPTION
錯誤處理部分]
END [過程名];
3.1存儲過程三種參數類型
存儲過程可以傳入參數,支持三種參數類型:
- 傳入參數:in或者不寫;
- 傳出參數:out,類似於返回值return。
- 傳入傳出參數: in out 既是傳入又是傳出。
這裏需要理解,存儲過程的參數都是存儲過程和調用環境的交互。
3.1創建簡單存儲過程
create or replace procedure p(v_in in number, v_out out number, v_v number, v_io in out number)
is
begin
if(v_in>v_v) then
v_out := v_in;
else
v_out := v_v;
end if;
v_io := v_io + 1;
end;
/
這裏需要注意的是,如果存儲過程中出現語法錯誤,仍然會創建。
3.2執行存儲過程
存儲過程有兩種執行方式:
方式一:通過exec關鍵字執行。
exec p;
方式二:通過PLSQL塊執行。
begin
p;
end;
因此基於方法二,我們可以通過存儲過程調用存儲過程,也可以通過PLSQL塊調用存儲過程,還可以通過JOB週期性調用存儲過程。
如下,我們通過PLSQL塊調用上述創建的存儲過程。
set serveroutput on;
declare
v_in number := 10;
v_v number := 20;
v_io number := 30;
v_out number;
begin
p(v_in, v_out, v_v, v_io);
dbms_output.put_line(v_out);
dbms_output.put_line(v_io);
end;
/
3.3刪除存儲過程
直接通過dorp關鍵字。
drop procedure p;