Oracle
在 oracle 中插入帶有嵌套表的對象表
我在 oracle 的嵌套表中插入時遇到問題
這些是相關的類型和表格;
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
我不明白問題到底是什麼,錯誤消息沒有幫助
為什麼它說缺少表達?
為什麼在第二種情況下它給單行子查詢返回不止一行?
非常感謝你。
**更新:**這裡是類型 movie_type 和表電影:
create type movie_type as Object ( MOVIE_ID NUMBER(15), TITLE VARCHAR(50) , GENRE VARCHAR(30), RELEASE_DATE DATE, RUNNING_TIME NUMBER, BUDGET NUMBER ) Final;
表創建:
create table MOVIE of movie_type; ALTER TABLE MOVIE ADD CONSTRAINT PK_MOVIE_ID PRIMARY KEY (MOVIE_ID); ALTER TABLE MOVIE modify TITLE not null;
電影中的相關插入:
INSERT INTO MOVIE (MOVIE_ID, TITLE, GENDER, RELEASE_DATE, RUNNING_TIME, BUDGET) VALUES (7,'Star Wars','epic space opera',TO_DATE('25/05/1977', 'DD/MM/YY'),121,11000000); INSERT INTO MOVIE (MOVIE_ID, TITLE, GENDER, RELEASE_DATE, RUNNING_TIME, BUDGET) VALUES (8,'The Empire Strikes Back','epic space opera',TO_DATE('17/05/1980', 'DD/MM/YY'),124,18000000); INSERT INTO MOVIE (MOVIE_ID, TITLE, GENDER, RELEASE_DATE, RUNNING_TIME, BUDGET) VALUES (9,'Return of the Jedi','epic space opera',TO_DATE('25/05/1983', 'DD/MM/YY'),132,32500000);
movies_type()
是建構子movies_type
它需要 1 個或多個
movie_type
. 每一個都用逗號隔開。您只在 SQL 中創建了一個實例。
你尋求的魔法咒語是:
Cast(multiset( select... ) as movies_type)
這個怎麼運作
movies_type
是嵌套表類型。您可以通過指定單個標量 SQL 語句來構造基數為 1 的 NT。(這是您在第三次嘗試中所擁有的)
insert into actor values (actor_type(29,'Carrie','Fisher',TO_DATE('21/10/1956', 'DD/MM/YYYY'),TO_DATE('27/12/2016', 'DD/MM/YYYY'),'USA' ,movies_type( (select ref(m) from movie m where movie_id = 7) -- single element ) ));
此外,您可以通過指定n 個元素來構造一個基數為*n的 NT。*在此範例中,我提供了 3 個標量 SQL 語句。
insert into actor values (actor_type(29,'Carrie','Fisher',TO_DATE('21/10/1956', 'DD/MM/YYYY'),TO_DATE('27/12/2016', 'DD/MM/YYYY'),'USA' ,movies_type( (select ref(m) from movie m where movie_id = 7), -- element 1 (select ref(m) from movie m where movie_id = 8), -- element 2 (select ref(m) from movie m where movie_id = 9) -- element 3 ) ));
但是,這不是你想要的。
為了將
SELECT
語句轉換為元素數組,您需要cast(multiset() as data_type)
像這樣使用:insert into actor values (actor_type(29,'Carrie','Fisher',TO_DATE('21/10/1956', 'DD/MM/YYYY'),TO_DATE('27/12/2016', 'DD/MM/YYYY'),'USA' ,cast(multiset( select ref(m) from movie m where movie_id in (7,8,9) ) as movies_type) ));