2012-07-19 106 views
0

我寫了下面的存儲過程,多個數據集回到我的前端.NET應用程序Oracle存儲過程返回多個結果到.NET

create or replace PROCEDURE GET_EMPLOYEE_INFO 
(
    EMP_NO IN VARCHAR2, 
    E_RECORD_SET1 OUT SYS_REFCURSOR, 
    E_RECORD_SET2 OUT SYS_REFCURSOR, 
    E_RECORD_SET3 OUT SYS_REFCURSOR, 
    E_RECORD_SET4 OUT SYS_REFCURSOR 
) AS 
BEGIN 
    OPEN E_RECORD_SET1 FOR 
    SELECT * FROM EMP.EMPLOYEES; 

    OPEN E_RECORD_SET2 FOR 
    SELECT * FROM EMP.CITIES; 

    OPEN E_RECORD_SET3 FOR 
    SELECT * FROM EMP.STATES; 

    OPEN E_RECORD_SET1 FOR 
    SELECT * FROM EMP.DURATION; 

每個查詢正確執行自身。當我執行存儲過程時,它顯示結果集,但我不相信所有的數據都被抓取。在底部,它仍然說「運行IDE連接」。

  • 過程是否循環?
  • SYS_REFCURSOR類型有限制嗎?
  • 我需要關閉這些遊標嗎?

回答

0
  • 我認爲您的實際存儲過程不缺少END底。您發佈的代碼不會編譯。
  • 我假設你的存儲過程也在做EMP_NO參數。
  • 我假設儘管名稱暗示它是一個數字,但EMP_NO實際上被聲明爲一個字符串。

假設所有這是真的

  • 爲什麼你認爲所有的數據不被提取?
  • 句子「在底部,它仍然表示」是什麼意思?這是你的C#應用​​程序嗎?你騎?還有別的嗎?
  • 您發佈的代碼(假設已添加END以便其編譯)無法循環。你的代碼只是打開遊標,它不會執行SQL語句,也不會生成任何數據。這隻有在客戶端應用程序開始獲取數據之後纔會發生。
  • 儘管這是一種不尋常的設計,但它在語法上完全有效,因此可以返回四個參數SYS_REFCURSOR。這不會影響從遊標中獲取的數據。
  • 是的,您的客戶端應用程序需要關閉這些光標,一旦它從中獲取所有數據。
+0

嘿賈斯汀感謝您的答覆,這裏是我對您的問題的答案。首先emp_no將用在我將在幾天內實現的where子句中。 emp_no是一個varchar,是的,我已經在存儲過程結束時結束。 「it」是指當我使用oracle sql developer執行存儲過程時打開的輸出日誌對話框。你也建議這是一個非常規的設計,你可以請建議一個更強大的設計作爲新的Oracle,我需要在oracle中使用遊標從存儲過程返回一個記錄集?我怎麼會關閉遊標? – 2012-07-19 21:34:15

+0

賈斯汀感謝您的回覆, 這裏是我對您問題的回答。 首先,emp_no將用在我將在幾天內實現的where子句中。 emp_no是一個varchar,是的,我已經在存儲過程結束時結束。 「it」是指當我使用oracle sql開發人員執行存儲過程時打開的輸出日誌對話框。 也你提出這是一個不尋常的設計,你可以請建議一個更強大的設計,因爲我是新來的oracle, 我需要在oracle中使用遊標來從存儲過程返回記錄集? 如何關閉遊標? – 2012-07-19 21:40:05

+0

@JustinRusso - 通常情況下,你要麼有單獨的過程,要麼你將返回一個單獨的'SYS_REFCURSOR',其結果是將所涉及的四個表加在一起。您不想嘗試在您的客戶端應用程序中推出自己的pududo-join邏輯。如果你只是從SQL Developer執行這個存儲過程(在這種情況下c#和.net標記似乎不適用),SQL Developer將關閉這些遊標。當您編寫C#代碼來調用此過程時,您的C#代碼將需要關閉遊標。 – 2012-07-19 22:27:23

相關問題