oracle存儲過程的結構包含三部分:1、過程聲明;2、執行過程部分;3、存儲過程異常,該部分可省略,如果要增強腳本的容錯性和調試的方便性那就寫上異常處理。
本教程操作環境:Windows7系統、Oracle 11g版、Dell G3電腦。
什么是存儲過程
存儲過程: 百度百科上是這樣解釋的,存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯后再次調用不需要再次編譯,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來調用存儲過程。
簡單的說就是專門干一件事一段sql語句。
可以由數據庫自己去調用,也可以由java程序去調用。
在oracle數據庫中存儲過程是procedure。
存儲過程結構
(1)基本結構
Oracle存儲過程包含三部分:過程聲明,執行過程部分,存儲過程異常(可寫可不寫,要增強腳本的容錯性和調試的方便性那就寫上異常處理)
(2)無參存儲過程
/** name_procedure就是自己自定義的存儲過程名 */ create?or?replace?procedure?name_procedure?AS/IS 變量名1??數據類型; 變量名2??數據類型; BEGIN --要處理的業務邏輯 EXCEPTION????--存儲過程異常 END?name_procedure;
(3).有參存儲過程
普通參數存儲過程
/* age?類型為number?初始化為20; */ CREATE?OR?REPLACE?PROCEDURE?name_procedure?(param1?TYPE) AS/IS name?varchar(20); age?number?:=20; BEGIN ??--業務處理..... END?;
帶參數的存儲過程并且進行賦值
CREATE?OR?REPLACE?PROCEDURE?存儲過程名稱( ???????s_no?in?varchar, ???????s_name?out?varchar, ???????s_age?number)?AS total?NUMBER?:=?0; BEGIN ??SELECT?COUNT(1)?INTO?total?FROM?student?s?WHERE?s.age=s_age; ??dbms_output.put_line('符合該年齡的學生有'||total||'人'); ??EXCEPTION ????WHEN?too_many_rows?THEN? ????DBMS_OUTPUT.PUT_LINE('返回值多于1行');? END
其中參數IN表示輸入參數,是參數的默認模式。
-
OUT表示返回值參數,類型可以使用任意Oracle中的合法類型。
-
OUT模式定義的參數只能在過程體內部賦值,表示該參數可以將某個值傳遞回調用他的過程
-
IN OUT表示該參數可以向該過程中傳遞值,也可以將某個值傳出去
第7行:查詢語句,把參數s_age作為過濾條件,INTO關鍵字,把查到的結果賦給total變量。
第8行:輸出查詢結果,在數據庫中“||”用來連接字符串
第9—11行:做異常處理
存儲過程語法
(1)運算符
(2)SELECT INTO STATEMENT語句
-
將查詢結果賦值給一個變量或多個變量
需求:查出成績為100分的那個學生的姓名,年齡,籍貫
CREATE?OR?REPLACE?PROCEDURE?DEMO_CDD1?IS s_name?VARCHAR2;???--學生名稱 s_age?NUMBER;??????--學生年齡 s_address?VARCHAR2;?--學生籍貫 BEGIN ??--給單個變量賦值 ??SELECT?student_address?INTO?s_address ??FROM?student?where?student_grade=100; ???--給多個變量賦值 ??SELECT?student_name,student_age?INTO?s_name,s_age ??FROM?student?where?student_grade=100; ??--輸出成績為100分的那個學生信息 ??dbms_output.put_line('姓名:'||s_name||',年齡:'||s_age||',籍貫:'||s_address); END
(3)選擇語句
//if?后面一定要添加THEN?相當于Java中的?大括號 IF?s_sex=1?THEN ??dbms_output.put_line('這個學生是男生'); ELSE?IF?THEN ??dbms_output.put_line('這個學生是女生'); ELSE ??dbms_output.put_line('這個學生性別錯誤'); END?IF
(4)循環語句
a.基本循環
LOOP ??IF?表達式?THEN ????EXIT; ??END?IF END?LOOP;
b.while循環
WHILE?表達式?LOOP ??dbms_output.put_line('haha'); END?LOOP;
c.for循環
//a?1?到?20?范圍 FOR?a?in?10?..?20?LOOP ??dbms_output.put_line('value?of?a:?'?||?a); END?LOOP;
推薦教程:《Oracle教程》