在 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 多行?
非常感谢。
您想使用 CAST
和 COLLECT
将引用聚合到一个集合中:
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
中整理所有行效率低.
我在 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 多行?
非常感谢。
您想使用 CAST
和 COLLECT
将引用聚合到一个集合中:
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
中整理所有行效率低.