Oracle

在 oracle 中插入帶有嵌套表的對象表

  • May 22, 2022

我在 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)
));

引用自:https://dba.stackexchange.com/questions/312438