Oracle儲存過程Procedure簡單介紹

2021-09-08 05:18:31 字數 3508 閱讀 4089

我們都知道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;

Oracle儲存過程呼叫儲存過程

oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...

ORACLE儲存過程

自定義函式開始 create or replace function fn wftemplateidget templatecategoryid number,organid number,templatemode number return number istemplateid number i...

Oracle 儲存過程

create or replace procedure p 有就替換,沒有就建立 iscursor c is select from emp for update begin for v emp in c loop if v emp.deptno 10 then update emp2 set sa...