在 oracle 中插入 table 个具有嵌套 table 的对象

insertion in a table of objects with nested table in oracle

我在 oracle

中插入嵌套 table 时遇到问题

这些是相关类型和 tables;

create type movies_type as Table of ref movie_type;

create type actor_type under person_type

(

starring movies_type

) Final;

create table actor of actor_type

NESTED TABLE starring STORE AS starring_nt;

这就是我尝试插入的方式

insert into actor values
(actor_type(29,'Carrie','Fisher',TO_DATE('21/10/1956', 'DD/MM/YY'),TO_DATE('27/12/2016', 'DD/MM/YY'),'USA', movies_type(select ref(m) from movie m where movie_id in (7, 8, 9))));

这行不通,它给出了

SQL Error: ORA-00936: missing expression

这不是很有帮助。

我还尝试将 select 语句嵌套在括号中,因为我认为这可能是语法错误

insert into actor values
(actor_type(29,'Carrie','Fisher',TO_DATE('21/10/1956', 'DD/MM/YY'),TO_DATE('27/12/2016', 'DD/MM/YY'),'USA', movies_type((select ref(m) from movie m where movie_id in (7, 8, 9)))));

但是它说

SQL ERROR ORA-01427: single-row subquery returns more than one row

所以我改成了这个

insert into actor values
(actor_type(29,'Carrie','Fisher',TO_DATE('21/10/1956', 'DD/MM/YY'),TO_DATE('27/12/2016', 'DD/MM/YY'),'USA', movies_type((select ref(m) from movie m where movie_id=7))));

这有效,但它不是我想要的,因为它不允许我在

中有多个值
movies_type

我不明白问题到底是什么,错误消息也没有帮助

为什么说缺少表情?

为什么在第二种情况下它给单行子查询 returns 多行?

非常感谢。

您想使用 CASTCOLLECT 将引用聚合到一个集合中:

insert into actor values(
  actor_type(
    29,
    'Carrie',
    'Fisher',
    DATE '1956-10-21',
    DATE '2016-12-27',
    'USA',
    (
      SELECT CAST( COLLECT(REF(m)) AS movies_type )
      FROM   movie m
      WHERE  movie_id IN (7, 8, 9)
    )
  )
);

db<>fiddle here


insert into actor values (actor_type(29,'Carrie','Fisher',TO_DATE('21/10/1956', 'DD/MM/YY'),TO_DATE('27/12/2016', 'DD/MM/YY'),'USA', movies_type(select ref(m) from movie m where movie_id in (7, 8, 9))));

why does it say missing expression?

因为你有 movie_type(),其中 () 括号用于对象的构造函数,然后你有一个 SELECT 语句嵌套在另一个语句中,该语句未包含在 () 括号(因为周围的括号用于构造函数)。

so i changed it to this

insert into actor values (actor_type(29,'Carrie','Fisher',TO_DATE('21/10/1956', 'DD/MM/YY'),TO_DATE('27/12/2016', 'DD/MM/YY'),'USA', movies_type((select ref(m) from movie m where movie_id=7))));

and why in the second case it gives single-row subquery returns more than one row?

因为,当您使用 WHERE movie_id IN (7,8,9) 时,查询是 return 3 行,它只需要 return 一行;为此,您需要将多行聚合到包含一个集合的单行中。

what's wrong with multiple rows as parameters to the constructor?

构造函数要求每个参数中有一个项目,因此您需要使用:

insert into actor values (
  actor_type(
    29,
    'Carrie',
    'Fisher',
    DATE '1956-10-21',
    DATE '2016-12-27',
    'USA',
    movies_type(
      (select ref(m) from movie m where movie_id=7),
      (select ref(m) from movie m where movie_id=8),
      (select ref(m) from movie m where movie_id=9)
    )
  )
);

这可行(假设 movie_id 是唯一的;如果不是,并且同一部电影的剧场版和导演剪辑版具有相同的 movie_id,那么它仍然会提高例外),但它可能对每个 SELECT 使用 table/index 扫描,并且比使用 CAST/COLLECT 在单个 SELECT 中整理所有行效率低.