【Oracle】存儲過程之完整篇
1.語法
create [or replace] procedure pro_name[(parameter1,parameter2,...)] is|as begin plsql_sentences; [exception] [dowith_sentences;] end pro_name;參數說明:
pro_name:存儲過程名稱
parameter1:參數
plsql_sentences:PL/SQL語句,它是存儲過程功能實現的主體。
dowith_sentences:異常處理語句,也是PL/SQL語句。
上面的parameter1指的是存儲過程被調用時候用的參數,內部變量需要在is|as關鍵字後邊定義,並使用;號結束
2.環境準備
2.1 創建表TMP001
字段 | 描述 | 類型 |
id | 客戶編號 | int |
name | 客戶名稱 | varchar2(100) |
gender | 客戶性別 | varchar2(2) |
age | 客戶年齡 | int |
address | 客戶地址 | varchar2(200) |
腳本:
create table TMP001( id int not null, name varchar2(100), gender varchar2(2), age int, address varchar2(200) )
3.具體案例
3.1創建一個簡單存儲過程,往表TMP001插入一條記錄
/******************************************************** 功能名稱:用於簡單存儲過程測試 用途 :插入一條記錄到TMP001表中 參數列表 --------------------------------------------------------- 參數 IN/OUT 類型 描述 --------------------------------------------------------- 無 --------------------------------------------------------- 版本號:1.0 --------------------------------------------------------- 作者:Qinys 日期:20180915 說明:創建 --------------------------------------------------------- --------------------------------------------------------- ********************************************************/ create or replace procedure proInsertTmp001 is begin insert into TMP001 values(1,‘張三‘,‘男‘,29,‘雲南省昆明市‘); commit; dbms_output.put_line(‘插入記錄成功!‘); end proInsertTmp001;
上述存儲過程放在PL/SQL Developer中編譯通過後,即可調用查看結果
調用存儲過程
①execute命令調用:execute proInsertTmp001
②使用PL/SQL塊
begin
proInsertTmp001;
end;
3.2聲明一個帶IN模式的存儲過程
/********************************************************************** 功能名稱:用於測試帶IN的存儲過程 用途 :插入一條記錄到TMP001表中 參數列表 參數列表 ----------------------------------------------------------------------- 參數 IN/OUT 類型 描述 ----------------------------------------------------------------------- int_id IN INT 客戶編號 var_name IN VARCHAR2 客戶名稱 var_gender IN VARCHAR2 客戶性別 int_age IN INT 客戶年齡 var_address IN VARCHAR2 客戶地址 ----------------------------------------------------------------------- 版本號:1.0 ----------------------------------------------------------------------- 作者:Qinys 日期:20180915 說明:創建 ----------------------------------------------------------------------- ----------------------------------------------------------------------- **********************************************************************/ create or replace procedure proInsertTmp002( int_id in int, var_name in varchar2, var_gender in varchar2, int_age in int, var_address in varchar2 ) is begin insert into TMP001 values(int_id,var_name,var_gender,int_age,var_address); commit; dbms_output.put_line(‘插入記錄成功!‘); end proInsertTmp002;
調用存儲過程
查看結果
3.3 聲明一個帶OUT模式的存儲過程
/********************************************************************** 功能名稱:用於測試帶OUT的存儲過程 用途 :調用存儲過程,並返回調用結果 參數列表 ----------------------------------------------------------------------- 參數 IN/OUT 類型 描述 ----------------------------------------------------------------------- int_id IN INT 客戶編號 var_name IN VARCHAR2 客戶名稱 var_gender IN VARCHAR2 客戶性別 int_age IN INT 客戶年齡 默認值為:18 var_address IN VARCHAR2 客戶地址 默認值為:China flag OUT VARCHAR2 1-成功 0-失敗 msg OUT VARCHAR2 返回錯誤代碼 ----------------------------------------------------------------------- 版本號:1.0 ----------------------------------------------------------------------- 作者:Qinys 日期:20180915 說明:創建 ----------------------------------------------------------------------- ----------------------------------------------------------------------- **********************************************************************/ create or replace procedure proInsertTmp004( int_id in int, var_name in varchar2, var_gender in varchar2, int_age in int default 18, var_address in varchar2 default ‘China‘, flag out varchar2, msg out varchar2 ) is begin proInsertTmp003(int_id,var_name,var_gender,int_age,var_address); commit; --主體程序運行完畢 flag :=‘1‘; --異常處理 exception when others then rollback; flag :=0; msg :=‘錯誤原因‘|| sqlcode || ‘,‘ || sqlerrm(sqlcode); end proInsertTmp004;
我們正常調用存儲過程proInsertTmp004
在output可以看到結果
非正常調用
output結果
3.4創建帶有默認值的存儲過程
/********************************************************************** 功能名稱:用於測試帶默認值的存儲過程 用途 :插入一條記錄到TMP001表中 參數列表 ----------------------------------------------------------------------- 參數 IN/OUT 類型 描述 ----------------------------------------------------------------------- int_id IN INT 客戶編號 var_name IN VARCHAR2 客戶名稱 var_gender IN VARCHAR2 客戶性別 int_age IN INT 客戶年齡 默認值為:18 var_address IN VARCHAR2 客戶地址 默認值為:China ----------------------------------------------------------------------- 版本號:1.0 ----------------------------------------------------------------------- 作者:Qinys 日期:20180915 說明:創建 ----------------------------------------------------------------------- ----------------------------------------------------------------------- **********************************************************************/ create or replace procedure proInsertTmp003( int_id in int, var_name in varchar2, var_gender in varchar2, int_age in int default 18, var_address in varchar2 default ‘China‘ ) is begin insert into TMP001 values(int_id,var_name,var_gender,int_age,var_address); commit; dbms_output.put_line(‘插入記錄成功!‘); end proInsertTmp003;
調用存儲過程
此處指傳入前三個參數
4.存儲過程調用傳遞參數
4.1使用指定名稱傳遞的方式傳遞參數
4.1.1 語法
pro_name(parameter1=>value1[,parameter1=>value1]…)
4.1.2 例子
我們從數據庫的得知,確實已經插入,並且字段順序沒變
4.2使用按位置的方式傳遞參數
4.2.1 語法
此種傳遞是我們最常用的,也就是值與參數一一對應
4.2.2 例子
見具體案例3.2中的調用存儲過程
4.3使用按位置的方式傳遞參數
4.3.1 語法
上述兩種傳遞方式混合起來,但是在某個位置使用“指定名稱傳遞”之後,後邊的參數值必須使用指定名稱傳遞,因為參數的原始定義順序可能已經被破壞
4.3.2 例子
【Oracle】存儲過程之完整篇