2017-08-21 80 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

那么请你接受答案。 –

相关问题