【问题标题】:one parent sys_refcursor record contains a child sys_refcursor type with multiple records一个父 sys_refcursor 记录包含具有多个记录的子 sys_refcursor 类型
【发布时间】:2015-04-10 03:08:24
【问题描述】:

数据库:Oracle 11gR2

你好,

我有 2 个表,它们之间存在父子关系(一对多)。现在我需要从存储过程返回一个引用游标,该存储过程将从父表中返回与输入参数相对应的一行,并从子表中返回相应的记录(可以是数组)。请注意,我们不想重复父级的结果集。因此,基本上我们只想返回一条记录,其中详细列是记录数组或父 sys 递归内的子 sys 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包含child.student_name的多条记录,child.result对应同一个class_id。

谢谢。

【问题讨论】:

    标签: sql plsql oracle11g


    【解决方案1】:

    您正在寻找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;
    

    【讨论】:

    • 感谢 Masheswaran,它有效。然而,这种方法的一个问题(有人告诉我)是,对于一个父母来说,它可以打开多个子游标,因此可能会导致一些问题。我想知道是否可以使用嵌套表/数组来传递父 sys_refcursor 中的子记录。你能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多