一個擴展存儲過程調用另一個存儲過程,示例:
被調用存儲過程:最后會返回一個游標,游標返回一個值。調用這個存儲過程的存儲過程同樣需要獲取它。
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;