1. 程式人生 > >【Oracle】存儲過程之完整篇

【Oracle】存儲過程之完整篇

lba 成功 語句 color dbms 名稱 ron 程序 參數說明

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】存儲過程之完整篇