現在有一個任務,就是需要把一個SQL server中的存盤程序改寫成Oracle下的。
遇到的問題是:
在SQL Server的存盤程序中,在while回圈下,有select陳述句。于是回傳多個結果集
但在Oracle的存盤程序中,回傳結果集得用游標,如果把游標放到while回圈下,會被一次次替換,最后只剩最后一張表了。
所以我想問各位前輩, 怎樣才能在Oracle存盤程序中回傳多個結果集
SQL Server中部分代碼:
while (@PointerPrev < LEN(@ID))
Begin
Set @PointerCurr=CharIndex(',',@ID,@PointerPrev)
if(@PointerCurr>0)
Begin
set @TId=cast(SUBSTRING(@ID,@PointerPrev,@PointerCurr-@PointerPrev) as int)
EXEC [dbo].[GetParentsById] --這句是呼叫另一個存盤程序,回傳一張表。
@id = @TID
SET @PointerPrev = @PointerCurr+1
End
else
Break
End
Oracle部分代碼:
while(pointerprev<length(ids)) loop
pointercurr:=instr(ids,',',pointerprev);
if(pointercurr>0) then
TID:=cast(substr(ids,pointerprev,pointercurr-pointerprev) as int);
open cur_sls for --在while回圈中用游標
with t as
(
select distinct t.*,level as lev from CG2 t
start with id=TID
connect by prior pid=id
order by level desc
)select t.*,CG_Resource.showFileName, dbo.CG_Resource.uniqueName AS serviceName, dbo.CG_Resource.dataUrl AS serviceUrl,
dbo.CG_Resource.fishnetUrl, dbo.CG_Resource.shpDataPath AS dataPath, dbo.CG_Resource.ip, dbo.CG_Resource.dataSize, dbo.CG_Resource.fields AS fieldNames,
dbo.CG_Resource.recordCount AS dataCount, dbo.CG_Resource.dataType
FROM t LEFT OUTER JOIN CG_Resource ON t.dataid =CG_Resource.id
WHERE (t.name IS NOT NULL);
pointerprev:=pointercurr+1;
else
exit;
end if;
end loop;
uj5u.com熱心網友回復:
Oracle中回傳結果集都是采用游標,如果要回傳多個結果集,必須采用多個游標型別的輸出引數。通常是不建議這樣做的。從接觸到Oracle至今,作業和學習中都沒有出現過一次這樣的實體。
uj5u.com熱心網友回復:
你說的回傳多個結果集,其實是可以使用SQL陳述句實作的。無須采用在存盤程序中采用回圈輸出。
uj5u.com熱心網友回復:
謝謝各位前輩。因為我是實習生,一個任務就是把別人的SQL server中的存盤程序改寫。他那邊思路是這樣的,我就想辦法實作。我特別想知道,oracle存盤程序中能否實作我上述要求。看來,是不太容易是嗎uj5u.com熱心網友回復:
還有一個思路是說,能不能存盤程序的輸出引數是一個游標型別的陣列,然后每次回圈把結果放到陣列里。但好像oracle中沒有游標型別陣列》?
uj5u.com熱心網友回復:
舉一個回傳3張表結果集的例子.實作代碼大致如下:
create or replace p_test
(
cur1 out sys_refcursor,
cur2 out sys_refcursor,
cur3 out sys_refcursor
)
is
begin
select t1.* into cur1 from t1;
select t2.* into cur2 from t2;
select t3.* into cur3 from t3;
end;
/
uj5u.com熱心網友回復:
這樣的代碼性能不好,可讀性和健壯性都非常差。一個程序回傳多張表。本身就是一種非常不妥的方案。任何情況下都不提倡這樣做。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/79200.html
標籤:開發
