【问题标题】:Insert multiple references in a nested table在嵌套表中插入多个引用
【发布时间】:2017-08-13 13:00:26
【问题描述】:

我有一个表 customer_table,其中包含对 account_table 行的引用列表(嵌套表)。

这是我的声明:

客户类型:

CREATE TYPE customer as object(
    custid integer,
    infos ref type_person,
    accounts accounts_list
);

accounts_list 类型:

CREATE TYPE accounts_list AS table of ref account;

表:

CREATE TABLE customer_table OF customer(
    custid primary key,
    constraint c_inf check(infos is not null),
    constraint c_acc check(accounts is not null)
)
NESTED TABLE accounts STORE AS accounts_refs_nt_table;

所以我想在创建客户时在我的嵌套表中插入多个引用,因为可以共享一个帐户。

我不知道该怎么做。

我试过了:

INSERT INTO customer_table(
    SELECT 0,
    ref(p),
    accounts_list(
        SELECT ref(a) FROM account_table a WHERE a.accid = 0
        UNION ALL 
        SELECT ref(a) FROM account_table a WHERE a.accid = 1
    )
    FROM DUAL
    FROM person_table p
    WHERE p.personid = 0
);

没有成功。

谢谢

【问题讨论】:

    标签: sql oracle reference nested-table object-oriented-database


    【解决方案1】:

    您可以使用the collect() function,例如在子查询中:

    INSERT INTO customer_table(
        SELECT 0,
        ref(p),
        (
          SELECT CAST(COLLECT(ref(a)) AS accounts_list) 
          FROM account_table a
          WHERE accid IN (0, 1)
        )
        FROM person_table p
        WHERE p.personid = 0
    );
    

    正如文档所说,“要从这个函数中获得准确的结果,你必须在 CAST 函数中使用它”,所以我明确地将它转换为你的 account_list 类型。

    如果您不想要子查询,您可以这样做:

    INSERT INTO customer_table(
        SELECT 0,
        ref(p),
        CAST(COLLECT(a.r) AS accounts_list)
        FROM person_table p
        CROSS JOIN (SELECT ref(a) AS r FROM account_table a WHERE accid IN (0, 1)) a
        WHERE p.personid = 0
        GROUP BY ref(p)
    );
    

    但我认为这有点混乱;检查两者的性能...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 2017-09-15
      • 1970-01-01
      • 2022-01-23
      • 2014-06-03
      相关资源
      最近更新 更多