Oracle 存儲過程調用返回游標的另一個存儲過程。


一個擴展存儲過程調用另一個存儲過程,示例:

被調用存儲過程:最后會返回一個游標,游標返回一個值。調用這個存儲過程的存儲過程同樣需要獲取它。

 procedure SearchBill       --根據到貨單號查詢所有行號
  (
     P_code   VARCHAR,
     P_UserCode varchar ,
     P_org      varchar,
     P_warehouse  varchar,
     p_movetype   varchar,
     p_billtype   varchar,
     p_note     varchar,
     p_isred    varchar2,
     p_exmovetype     varchar2,
     p_ReCursor0 out T_CURSOR
  )
  IS
  v_count    int;
begin

    -------------------------------代碼--------------------------

    open p_ReCursor0 for  SELECT v_count num FROM dual;

end SearchBill   ;    

在這個處理中,返回的結果是一個數字的游標。只有一行數據。

因此我接收的時候,用一個int變量接收他。

同時調用存儲過程時候,需要定義一個游標變量用來傳進去,返回的結果通過這個游標取的。

CREATE OR REPLACE PACKAGE BODY ERP_IMIM_Grreqbill IS 

  procedure SearchBillEx 
  (
     P_code   VARCHAR,
     P_UserCode varchar ,
     P_org      varchar,
     P_warehouse  varchar,
     p_movetype   varchar,
     p_billtype   varchar,
     p_note     varchar,
     p_isred    varchar2,
     p_exmovetype     varchar2,
     p_ReCursor0 out T_CURSOR
  )

  IS p_ReCursor1 T_Cursor; num int; begin

    SearchBill(P_code,P_UserCode,P_org,P_warehouse,p_movetype,p_billtype,p_note,p_isred,p_exmovetype,p_ReCursor1);
     
    FETCH p_ReCursor1 INTO num; //把游標獲取的數據賦值給int類型變量。注意,對於有多行數據返回的游標,需要循環遍歷游標,不能這樣。
     
    open p_ReCursor0 for select num num from dual;//把這個結果同樣返回出去。

  end SearchBillEx;

 

 

另外對於接收的結果含有多行數據,各個字段不知道類型,但是有一個對應的表查詢的SQL的游標,行的字段對應類型可以統一用一個變量定義。

先設置一個字段相對應的游標,然后通過%rowtype設置類型。

例子:

-- 包頭定義返回游標類型
TYPE T_Cursor IS REF CURSOR;
-- 包體存儲過程里聲明
Declare p_ReCursor1 T_Cursor;

--通過這種方式可以設置游標返回結果集各個字段的變量,類型。下面的p_ReRow1就可以直接通過p_ReRow1.字段名方式獲取返回游標對應值。
cursor Temp_Cursor1 is SELECT BatchID,BatchCode,DisabledDate,CAST(0 AS DECIMAL(20,8)) as Quantity FROM Batches WHERE 1=2;

p_ReRow1 Temp_Cursor1
%rowtype; -- 存儲過內部調用其他存儲過程並獲取返回結果 ERP_IMBillInterFace.BatchHelpIss(p_CompanyID,p_OrgID,p_WarehouseID,row_cursor2.ChaintBatch,'','','','',p_MaterialID,'','','01','Z','', p_BatchNumCode,'','','','','',p_CurDate,'','1','0','1',p_IsLMGR,'10',p_MoveTypeID,(Case p_IsRed When '0' Then '2' Else '1' End), row_cursor2.BCF1,row_cursor2.BCF2,row_cursor2.BCF3,row_cursor2.BCF4,row_cursor2.BCF5,row_cursor2.BCF6,row_cursor2.BCF7,row_cursor2.BCF8, row_cursor2.BCF9,row_cursor2.BCF11,row_cursor2.BCF12,row_cursor2.BCF13,row_cursor2.BCF14,row_cursor2.BCF16,row_cursor2.BCF20, p_ReCursor1); Loop fetch p_ReCursor1 into p_ReRow1; exit when p_ReCursor1%notfound; insert into Temp_SaveData_TB(BatchID,BatchCode,DisabledDate,Quantity) values (p_ReRow1.BatchID,p_ReRow1.BatchCode,p_ReRow1.DisabledDate,p_ReRow1.Quantity); End Loop;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM