Oracle儲存過程學習

2021-08-20 19:26:02 字數 4263 閱讀 6236

儲存過程是一組為了完成特定功能的

sql

語句塊,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。

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

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

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

createor replace procedure

儲存過程名

as宣告語句段;

begin

執行語句段;

exception

異常處理語句段;

end;

其中create or replace procedure 是乙個sql語句,通知oracle資料庫去建立乙個儲存過程, or replace表示如果存在就覆蓋它。

使用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)

isbegin

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)

isbegin  --

將查詢到的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的型別

declare

sname student.sname

%type;--

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

begin

pro_delstudent(1

,sname

);--

呼叫儲存過程

dbms_output.put_line(sn

ame);

--列印儲存過程輸出的結果

,此句新增至儲存過程中也可,

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)儲存過程

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

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'

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

trim函式具有如下的形式:

trim([leading/trailing/both][匹配字串或數值][from][需要被處理的字串或數值])

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

trim函式返回的型別是varchar2。

Oracle儲存過程學習

儲存過程建立語法 create or replace procedure 儲存過程名 param1 in type,param2 out type as 變數1 型別 值範圍 變數2 型別 值範圍 begin select count into 變數1 from 表a where列名 param1 ...

Oracle儲存過程學習

儲存過程建立語法 create or replace procedure 儲存過程名 param1 in type,param2 out type as 變數1 型別 值範圍 變數2 型別 值範圍 begin select count into 變數1 from 表a where列名 param1 ...

Oracle儲存過程學習

儲存過程建立語法 create or replace procedure 儲存過程名 param1 in type,param2 out type as 變數1 型別 值範圍 變數2 型別 值範圍 begin select count into 變數1 from 表a where列名 param1 ...