2015-02-10 35 views
2

DB:甲骨文11gR2的一個父SYS_REFCURSOR記錄包含多個記錄孩子SYS_REFCURSOR類型

你好,

我有2個表和他們之間的父子關係(一到多)。現在我需要從一個存儲過程返回一個ref-cursor,它將從父表中返回一行,對應於輸入參數和子表中相應的記錄(可以是數組)。請注意,我們不希望重複父級的結果集。所以基本上我們只想返回一個記錄,其中detail列是一個記錄數組或一個父系統recursor內的子系統refcursor。問題是我該怎麼做?

下面是示例表,數據和通常的程序(返回多行 - 這不旨在):

create table parent 
(
    class_id  varchar2(2), 
    class_name  varchar2(10), 
    subject_name varchar2(10), 
    constraint pk_id primary key (class_id) 
); 

create table child 
(
    class_id  varchar2(10), 
    student_name varchar2(10), 
    result   varchar2(10), 
    constraint fk_id Foreign key (class_id) references parent(class_id) 
); 

insert into parent values('1', 'class_1', 'subject_1'); 
insert into parent values('2', 'class_2', 'subject_2'); 
insert into parent values('3', 'class_3', 'subject_3'); 
insert into parent values('4', 'class_4', 'subject_4'); 

insert into child values ('1', 'student_1', 'pass'); 
insert into child values ('1', 'student_2', 'fail'); 
insert into child values ('1', 'student_3', 'pass'); 
insert into child values ('2', 'student_1', 'pass'); 
insert into child values ('2', 'student_4', 'fail'); 

create or replace PROCEDURE get_data (
    class_id_in  IN  parent.class_id%TYPE, 
    student_list_cur OUT  SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN student_list_cur FOR 
    SELECT p.class_name, 
      p.subject_name, 
      c.student_name, 
      c.result 
    FROM parent p, child c 
    WHERE p.class_id = c.class_id 
    AND p.class_id = class_id_in; 

END get_data; 

再次注意,SYS-REFCURSOR回報:

class_name  subject_name  student_name  result 
------------------------------------------------------- 
class_1   subject_1  student_1  pass 
class_1   subject_1  student_2  fail 
class_1   subject_1  student_3  pass 

相反我想要的是一條記錄,如:

parent.class_name, 
parent.subject_name, 
child.array_of_records SYS_REFCURSOR 

其中child.array_of_records包含mul child.student_name,child.result的記錄對應於相同的class_id。

謝謝。

回答

0

您正在查找CURSOR SUBQUERY

OPEN student_list_cur FOR 
SELECT p.class_name, 
     p.subject_name, 
     CURSOR(SELECT c.student_name, 
        c.result 
       FROM 
       child c 
       WHERE p.class_id = c.class_id) 
FROM parent p 
WHERE p.class_id = class_id_in; 
+0

感謝Masheswaran,它的工作原理。然而,這種方法的一個問題(我被告知)是,一個父母可以打開多個孩子游標,因此可能會導致一些問題。我想知道是否可以使用嵌套表/數組來傳遞父級sys_refcursor內的子記錄。你能否說出一些看法。 – user1804548 2015-02-11 20:49:35