天天看點

PB 調用存儲過程全攻略[Oracle篇]

話不多說,直接正題。偏重Declare方式

一、PB中調用過程的一般格式

Declare my_proce Procedure For p_get_name;
// 定義過程調用

Execute my_proce ;
// 執行過程,這裡是不需要其他參數的

If SQLCA.SQLCode <> 0 Then // 調用過程出現錯誤處理
End If

Fetch my_proce Into :ls_ReturnName;
// 擷取出參值,也就是OUT的變量,如果沒有out類型的變量,這句也就不需要了

If SQLCA.SQLCode <> 0 Then // 擷取資料出現錯誤處理
End If

Close my_proce ;
// 關閉調用
           

二、下面主要表述不同的存儲過程對應的定義方式

  一、 無入參存儲過程調用

Create Or Replace Procedure p_get_name(v_name Out Varchar2) As
//存儲過程,有一個out類型參數,無入參
Begin 
    v_name := 'Jone';
End;

//在PB中這樣定義
Declare my_proce Procedure For p_get_name;   // 正确
Declare my_proce Procedure For p_get_name(); // 這個也正确
//如果你試圖傳一個參數
Declare my_proce Procedure For p_get_name(:ls_Name); 這個就會在執行的時候報錯了
           

  二、 有入參存儲過程調用

Create Or Replace Procedure p_get_name(v_First in Varchar2,
                                       v_Last  in varchar2,
                                       v_name Out Varchar2) As
Begin
    v_name := v_First||v_Last;
End;

//在PB中這樣定義 ,這裡起名A ,B ,主要是為了不以字面意義影響了思路

Declare my_proce Procedure For p_get_name(:ls_A ,:ls_B)
//正确,這裡的變量會和過程變量循序的對應 ,也就是ls_A對應v_first ,ls_B 對應 v_Last

Declare my_proce Procedure For p_get_name(:ls_B ,:ls_A)
//正确,這裡的變量會和過程變量循序的對應 ,也就是ls_B對應v_first ,ls_A 對應 v_Last

Declare my_proce Procedure For p_get_name("Michael ","Jordan") 
//錯誤,直接使用值是不行的,必須使用變量

//我們來指定對應關系,這樣就不依賴你輸入的順序了
Declare my_proce Procedure For p_get_name(v_last=>:ls_A,v_first=>:ls_B)
Declare my_proce Procedure For p_get_name(v_first=>:ls_B,v_last=>:ls_A) 
//上面這2個定義是完全一樣的

Declare my_proce Procedure For p_get_name(v_first1=>:ls_First,v_last=>:ls_Last) 
//這個定義是錯誤的 ,因為過程中根本就沒有叫v_first1的參數

Declare my_proce Procedure For p_get_name(:ls_A ,:ls_B,:ls_C)
//錯誤,你試圖給給OUT類型的參數也傳一個進去就錯誤了

/*注意: 如果存儲過程定義的OUT類型的參數不在最後,而是位于入參的中間或者前面的話,那麼在PB中定義的話就必須指定對應,否則會報錯的,比如:*/
Create Or Replace Procedure p_get_name(v_name Out Varchar2,
				       v_First in Varchar2,
                                       v_Last  in varchar2
                                       ) As
Begin
    v_name := v_First||v_Last;
End;
//這是就必須使用 v_First=> ,v_Last=>這樣的定義 ,否則就是錯誤的
           

三、INOUT類型過程的調用

//PB中使用Declare方式不能調用具有in out類型參數的存儲過程的,故采用外部接口的方式
//直接上步驟 

1. 建立一個事務對象 uo_transcation , new->pb object->standart class->transcation ,命名為uo_transcation 
2. 在uo_transcation 的Local External Functions 中定義存儲過程,形如:
   subroutine p_get_name(string v_First, string v_Last,ref string v_name) rpcfunc

   1. subroutine 過程無傳回值
   2. rpcfunc  不明白,照寫吧 ,呵呵
   3. ref 這個是重點 ,代表這變量可以是out,in out 類型
3. 把uo_transcation 當作預設事務對象 
   1. 找到application ,也就是你程式寫第一open的那個地方
   2. 點選菜單 view -> propreties 就打開application的屬性了
   3. 點選 additional Properties -> variable Types ->sqlca 下面框修改成uo_transcation 
   4. OK
4. 在程式中直接使用 sqlca.p_get_name(a,b,c)這樣的就可以 ,和普通函數一樣

注意: 其實這也是PB調用存儲過程的一個方法
           

四、使用動态SQL調用存儲過程

// 使用動态sql調用無參數存儲過程 一直出錯,無法繼續。。。。。。。