2017-08-21 81 views
0

我想在過程中使用sysrefcursor返回表類型。 所以我有定義的記錄和表類型:如何使用sysrefcursor從過程返回表類型(集合)PLSQL

create or replace TYPE "FILE_RECORD" as object 
(ID NUMBER(30,0), CREATE_DATE TIMESTAMP(6)); 

create or replace TYPE "FILE_TABLE" AS TABLE OF FILE_RECORD; 

create or replace TYPE "MSG_RECORD" as object 
(ID NUMBER(30,0), CREATE_DATE TIMESTAMP(6)); 

create or replace TYPE "MSG_TABLE" AS TABLE OF MSG_RECORD; 

而寫的程序:

create or replace procedure file_msg 
     (i_date IN date, 
     o_cur OUT SYS_REFCURSOR) 
    AS 
    l_file FILE_TABLE; 
    l_msg MSG_TABLE; 

    BEGIN 

     l_file := FILE_TABLE(); 
     l_msg := MSG_TABLE(); 

     SELECT FILE_RECORD 
      (fi.id, 
       fi.create_date) 
     BULK COLLECT INTO l_file 
     FROM FILES fi 
     WHERE fi.create_date between i_date and i_date +1; 

     for i in l_file.FIRST..l_file.LAST 
      LOOP 
      SELECT MSG_RECORD 
       (me.id, 
       me.create_date) 
      BULK COLLECT INTO l_msg 
      FROM messages me 
      WHERE file_id = l_file(i).id; 

      END LOOP; 

END file_msg; 

因此,如何能我現在回到表類型l_msg並與此過程sysrefcursor l_file?

我必須與REFCURSOR而不是列從真正的表它是如何在問題中詳細說明返回表類型(集合):

如何存儲將返回sysrefcursor函數的結果呢?

邢建議。 我試着從這個問題的解決方案,但它並沒有幫助我。

+0

的可能的複製[如何存儲將返回sysrefcursor函數的結果?](https://stackoverflow.com/questions/45263749/how-to-store-result-of-a-function- which-will-return-sysrefcursor) – XING

+0

本主題的解決方案對我的過程不起作用。 – Tom

+0

'FILE_RECORD'和'MSG_RECORD'具有相同的屬性。其實沒有必要定義重複。 –

回答

0

你可以做到這一點是:

CREATE OR REPLACE PROCEDURE file_msg (i_date IN  DATE, 
             o_cur  OUT SYS_REFCURSOR, 
             P_cure OUT SYS_REFCURSOR) 
    AS 
    l_file FILE_TABLE; 
    l_msg MSG_TABLE; 
BEGIN 
    l_file := FILE_TABLE(); 
    l_msg := MSG_TABLE(); 

    SELECT FILE_RECORD (fi.id, fi.create_date) 
    BULK COLLECT INTO l_file 
    FROM FILES fi 
    WHERE fi.create_date BETWEEN i_date AND i_date + 1; 

    Open P_cure for select * from table(l_file); 

    FOR i IN l_file.FIRST .. l_file.LAST 
    LOOP 
     SELECT MSG_RECORD(me.id, me.create_date) 
     BULK COLLECT INTO l_msg 
     FROM messages me 
     WHERE file_id = l_file(i).id; 
    END LOOP; 

    Open o_cur for select * from table(l_msg); 

END file_msg; 
+0

謝謝,但如果我想要返回l_msg和l_file與refcursor如何做到這一點? – Tom

+0

@Tom。檢查更新的答案 – XING

+0

好的,謝謝你的回答。 – Tom

1

希望爲需要這種實際工作。

CREATE OR REPLACE 
PROCEDURE file_msg(
    i_date IN DATE, 
    o_cur OUT SYS_REFCURSOR, 
    P_cure OUT SYS_REFCURSOR) 
AS 
    l_file FILE_TABLE; 
    l_msg MSG_TABLE; 
BEGIN 
    l_file := FILE_TABLE(); 
    l_msg := MSG_TABLE(); 
    SELECT FILE_RECORD (fi.id, fi.create_date) BULK COLLECT 
    INTO l_file 
    FROM FILES fi 
    WHERE fi.create_date BETWEEN i_date AND i_date + 1; 
    OPEN P_cure FOR SELECT       * FROM TABLE(l_file); 
    SELECT MSG_RECORD(me.id, me.create_date) BULK COLLECT 
    INTO l_msg 
    FROM messages me 
    WHERE file_id IN 
    (SELECT lv.id FROM TABLE(l_file) lv 
    ); 
    OPEN o_cur FOR SELECT * FROM TABLE(l_msg); 
END file_msg; 
/
+0

它現在返回第二個遊標的所有值。 – Tom

+0

很高興聽到您的查詢已解決。 –

+0

那麼請你接受答案。 –

相關問題