Oracle存儲過程Procedure簡單介紹(第一部分)
我們都知道SQL語言是沒有判斷和過程控制語句的,而PL/SQL又很好的補充了SQL語言這方面的不足。而存儲過程也是一種PL/SQL塊,但是存儲過程又跟傳統的PL/SQL塊不一樣,存儲過程是以命名的方式存儲于數據庫中的。它有很多優點,比如:
1、存儲過程是以命名的數據庫對象形式存儲于數據庫當中。存儲在數據庫中的優點是很明顯的,因為代碼不保存在本地,用戶可以在任何客戶機上登錄到數據庫,并調用或修改代碼。
2、存儲過程可由數據庫提供安全保證,要想使用存儲過程,需要有存儲過程的所有者的授權,只有被授權的用戶或創建者本身才能調用執行存儲過程。
3、存儲過程的信息是寫入數據字典的,所以存儲過程可以看作是一個公用模塊,用戶編寫的PL/SQL程序或其他存儲過程都可以調用它(但存儲過程和函數不能調用PL/SQL程序)。一個重復使用的功能,可以設計成為存儲過程。
4、像其他高級語言的過程和函數一樣,可以傳遞參數給存儲過程,參數的傳遞也有多種方式。存儲過程可以有返回值,也可以沒有返回值,存儲過程的返回值必須通過參數帶回;函數有一定的數據類型,像其他的標準函數一樣,我們可以通過對函數名的調用返回函數值。
5、存儲過程需要進行編譯,以排除語法錯誤,只有編譯通過才能調用。
Oracle存儲過程基本語法
CREATE OR REPLACE PROCEDURE 存儲過程名(參數)
IS/AS
變量
BEGIN
可執行部分
EXCEPTION
錯誤處理部分
END;
按照慣例舉個hello world的例子
create or replace procedure hello as
say_hi varchar2(20);
begin
say_hi := 'Hello World';
dbms_output.put_line(say_hi);
end;
/
語法說明:
1、create or replace procedure是創建存儲過程的一個基本語法
2、在存儲過程(PROCEDURE)和函數(FUNCTION)中使用IS和AS并沒有太大區別,在視圖(VIEW)中只能用AS不能用IS,在游標(CURSOR)中只能用IS不能用AS。后面一般跟變量聲明。
3、begin和end之間是PL/SQL程序體,其中exception來指定失敗處理流程。
調用一個存儲過程
begin
-- Call the procedure
hello;
end;
存儲的查看和刪除:
查詢存儲過程hello的創建腳本
select * from user_source where name='HELLO';
查看存儲過程hello的狀態
select * from user_objects where object_name = 'HELLO';
重點看status列的狀態,valid表示該存儲過程是通過編譯的,invalid
我們可以看到一個存儲過程是有參數可以聲明的,那么關于參數肯定就有輸入和輸出參數的區別了
三種形式的參數
1、IN 定義一個輸入參數變量,用于傳遞參數給存儲過程
2、OUT 定義一個輸出參數變量,用于從存儲過程獲取數據
3、IN OUT 定義一個輸入、輸出參數變量,兼有以上兩者的功能
參數的定義形式和作用如下:
IN參數
語法:參數名 IN 數據類型 DEFAULT 值;
定義一個輸入參數變量,用于傳遞參數給存儲過程。在調用存儲過程時,主程序的實際參數可以是常量、有值變量或表達式等。DEFAULT 關鍵字為可選項,用來設定參數的默認值。如果在調用存儲過程時不指明參數,則參數變量取默認值。在存儲過程中,輸入變量接收主程序傳遞的值,但不能對其進行賦值。
OUT參數
語法:參數名 OUT 數據類型;
定義一個輸出參數變量,用于從存儲過程獲取數據,即變量從存儲過程中返回值給主程序。
在調用存儲過程時,主程序的實際參數只能是一個變量,而不能是常量或表達式。在存儲過程中,參數變量只能被賦值而不能將其用于賦值,在存儲過程中必須給輸出變量至少賦值一次。
IN OUT參數
語法:參數名 IN OUT 數據類型 DEFAULT 值;
定義一個輸入、輸出參數變量,兼有以上兩者的功能。在調用存儲過程時,主程序的實際參數只能是一個變量,而不能是常量或表達式。DEFAULT 關鍵字為可選項,用來設定參數的默認值。在存儲過程中,變量接收主程序傳遞的值,同時可以參加賦值運算,也可以對其進行賦值。在存儲過程中必須給變量至少賦值一次。
1、參數in的舉例
create or replace procedure say_hello (to_who in varchar2 default 'zhangsan') as
begin
dbms_output.put_line('Say Hi to '|| to_who);
end;
執行
begin
-- Call the procedure
say_hello( 'peter');
end;
2、參數out的舉例
輸出模式的參數,用于輸出值,會忽略傳入的值。在子程序內部可以對其進行修改。
輸出:子程序執行完畢后,out模式參數最終的值會賦值給調用時對應的<實參變量>。
注意:out模式參數的調用,必須通過變量。
create or replace procedure pout(p1 out int) as
begin
p1 := 33;
end;
執行
declare
var1 int := 30;
begin
dbms_output.put_line(var1);
pout(var1);
dbms_output.put_line(var1);
end;
第一次輸出30,第二次輸出33。
3、參數in out的舉例
輸入輸出模式:能接收傳入的實參值;在子程序內部可以修改; 可以輸出(必須用實參變量調用)
create or replace procedure pinout(p1 in out int) as
begin
dbms_output.put_line(p1);
p1 := 44;
end;
執行
declare
var1 int := 40;
begin
dbms_output.put_line(var1);
pinout(var1);
dbms_output.put_line(var1);
end;
到這里我們介紹了存儲過程的一些基本概念,在下一篇博客里,我們要介紹存儲過程的一些高級功能。