1. 程式人生 > >Oracle儲存過程學習

Oracle儲存過程學習

一、儲存過程的定義

儲存過程是一組為了完成特定功能的SQL 語句塊,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。

二、使用儲存過程的優點

1、儲存過程和函式以命名的資料庫物件形式儲存於資料庫當中。儲存在資料庫中的優點是很明顯的,因為程式碼不儲存在本地,使用者可以在任何客戶機上登入到資料庫,並呼叫或修改程式碼。

2、儲存過程和函式可由資料庫提供安全保證,要想使用儲存過程和函式,需要有儲存過程和函式的所有者的授權,只有被授權的使用者或建立者本身才能執行儲存過程或呼叫函式。

3、儲存過程可以看作是一個公用模組,使用者編寫的PL/SQL程式或其他儲存過程都可以呼叫它(但儲存過程和函式不能呼叫PL/SQL程式)。一個重複使用的功能,可以設計成為儲存過程。

三、儲存過程的語法結構

createor replace procedure 儲存過程名 as
宣告語句段;
begin
執行語句段;
exception
異常處理語句段;
end;

其中CREATE OR REPLACE PROCEDURE 是一個SQL語句,通知Oracle資料庫去建立一個儲存過程, or replace表示如果存在就覆蓋它。

IS關鍵詞表明後面將跟隨一個PL/SQL體。

BEGIN關鍵詞表明PL/SQL體的開始。

END關鍵詞表明PL/SQL體的結束。

四、儲存過程的呼叫和刪除

(一)呼叫

使用PLSQL Developer呼叫儲存過程是可以使用call或begin...end命令,在SQL Tools中執行的話,可以使用EXECUTE、exec和call來呼叫已經寫好的儲存過程。

呼叫時”()”是不可少的,無論是有引數還是無引數。

不加”()”會報錯,錯誤如下:

定義對資料庫過程的呼叫時:
1、無引數過程:call procedure_name();
2、僅有輸入引數的過程:call procedure_name(?,?,...);
這裡?表示輸入引數,建立儲存過程時用in表示輸入引數

3、僅有輸出引數的過程:call procedure_name(?,?,...);
這裡的?表示輸出引數,建立儲存過程時用out表示輸入引數

4、既有輸入引數又有輸出引數的過程:call procedure_name(?,?...);
這裡的?有表示輸出引數的,也有表示輸入引數的

(二)刪除

drop procedure procedure_name

    --在儲存過程中能呼叫另外一個儲存過程,而不能刪除另外一個儲存過程

五、例項

(一)帶輸入引數儲存過程的建立

 建立一張student表

create table STUDENT

(

  sid    NUMBER,

  sname  VARCHAR2(20),

  sage   NUMBER,

sgender VARCHAR2(2)

)

使用儲存過程來為student表插入一條資料

create or replaceprocedure pro_addstudent

(sid instudent.sid%type,sname in student.sname%type , sage instudent.sage%type,sgender in student.sgender%type)

is

begin

  insert into student (sid,sname,sage,sgender)values(sid,sname,sage,sgender);

end;

註釋:sname為輸入引數使用關鍵字in標識,型別為 student表中sname欄位的型別,sage同理。

(二)帶輸入引數儲存過程的呼叫

begin

  pro_addstudent(2,'小李',23,'女');

end;

call pro_addstudent(1,'漢漢',23,'男');

Commit;

(三)輸入輸出儲存過程的建立

使用儲存過程實現在為student刪除一條記錄是,先返回要刪除的學生的姓名,如果存在刪除成功,如果不存在,丟擲異常,顯示未找到資料。

create or replaceprocedure pro_delstudent (s in student.sid%type,sn out student.sname%type)

is

begin  --將查詢到的sname值賦給輸出引數sn

  select sname into sn from student wheresid=s;

  delete from student where sid=s; 

--異常處理

  exception --未查詢相關的sname資料時丟擲異常

    when no_data_found then sn:='未找到資料';

end;

註釋: s為輸入引數,sn為輸出引數使用out關鍵字標識,型別為student表中sname的型別

(四)輸入輸出儲存過程的呼叫

declaresname student.sname%type;

--宣告一個sname的變數,來儲存儲存過程輸出的結果

begin

  pro_delstudent(1,sname);--呼叫儲存過程

  dbms_output.put_line(sname);--列印儲存過程輸出的結果,此句新增至儲存過程中也可,dbms_output.put_line();可新增至任何begin...end;語句中間

end;

六、儲存過程學習補充

(一)自治事務

Oracle自治事務是指的儲存過程和函式可以自己處理內部事務不受外部事務的影響,用pragma autonomous_transaction來宣告,要建立一個自治事務,您必須在匿名塊的最高層或者儲存過程、函式、資料包或觸發的定義部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION語句。在這樣的模組或過程中執行的SQL語句都是自治的PRAGMA AUTONOMOUS_TRANSACTION

當前的儲存過程作為已有事務的子事務執行,子事務的commit,rollback操作不影響父事務的狀態

可以用於

(1)匿名塊

(2)觸發器

(3)儲存過程

自治事務可以用於在客戶化程式中記錄除錯資訊

(二)substr函式

1、用處:是從給定的字元表示式或備註欄位中返回一個子字串。

2、語法格式:

substr( string, start_position, [ length ] )

引數分析:

String   字串值

Start_position  擷取字串的初始位置,Number型,start_position為負數時,表示從字串右邊數起。

Length  擷取位數,Number型

其中,length為可選,如果length為空(即不填)則返回start_position後面的所有字元。

意思就是:從start_position開始,取出length個字元並返回取出的字串。

如:
substr('This is a test', 6, 2) would return 'is'

substr('This is a test', 6)  would return 'is a test'
substr('TechOnTheNet', -3, 3) would return 'Net'
substr('TechOnTheNet', -6, 3) would return 'The'

select substr('Thisisatest', -4, 2) value from dual結果是 te

select substr('emros',-3,1) value from dual 結果是 r 

substr('abcde',-6) = null 
substr('abcde',-5) = 'abcde' 
substr('abcde',-4) = 'bcde' 
substr('abcde',-3) = 'cde' 
substr('abcde',-2) = 'de' 
substr('abcde',-1) = 'e' 
substr('abcde',-0) = 'abcde'

(三)instr()函式

在Oracle中,可以使用instr函式對某個字串進行判斷,判斷其是否含有指定的字元。 在一個字串中查詢指定的字元,返回被查詢到的指定的字元的位置。 
語法: 
instr(sourceString,destString,start,appearPosition) 
instr('源字串' , '目標字串' ,'開始位置','第幾次出現') 
其中sourceString代表源字串; 
destString代表要從源字串中查詢的子串; 
start代表查詢的開始位置,這個引數可選的,預設為1; 
appearPosition代表想從源字元中查找出第幾次出現的destString,這個引數也是可選的,預設為1 
如果start的值為負數,則代表從右往左進行查詢,但是位置資料仍然從左向右計算。返回值為:查詢到的字串的位置。

(四)Trim函式

Oracle中的trim函式是用來刪除給定字串或者給定數字中的頭部或者尾部的給定字元。

trim函式具有如下的形式:
trim([leading/trailing/both][匹配字串或數值][from][需要被處理的字串或數值])

這裡如果指明瞭leading表示從刪除頭部匹配的字串,如果指明瞭trailing表示從刪除尾部匹配的字串,如果指明瞭both,或者不指明任何位置,則兩端都將被刪除;如果不指明任何匹配字串或數值則認為是空格,即刪除前面或者後面的空格。

trim函式返回的型別是varchar2。