我创建了以下表格和类型......
CREATE TYPE ACTOR_QUOTE_TYPE AS OBJECT (
Movie_Title CHAR(36),
Year NUMBER,
Role CHAR(36),
Quote CHAR(255)
)
/
CREATE TYPE AQ_NT AS TABLE OF ACTOR_QUOTE_TYPE
/
CREATE TABLE ACTOR_QUOTES (
ACTORID CHAR(5),
QUOTES AQ_NT
) NESTED TABLE QUOTES STORE AS ACTOR_QUOTES_NT
/
我需要创建一个......
名为 INIT_ACTOR_QUOTES 的 PL/SQL 过程,不带参数:
从 ACTOR 表中读取所有 ACTORID,并将它们插入到 ACTOR_QUOTES 表中每一行的 ACTORID 属性中(这些表具有相同的基数),同时将以下初始值插入到 QUOTES 嵌套表的第一行中进入 ACTOR_QUOTES 表的每一行;
(Movie_Title, Year, Role, Quote) 分别设置为 (' ',NULL ,' ', ' ')
此外,在每次 INSERT 之后立即使用 DELETE 删除嵌套表中属于 ACTOR_QUOTES 表中每个 ACTORID 的每一行中的所有行。
我的代码出现编译错误......
CREATE OR REPLACE PROCEDURE INIT_ACTOR_QUOTES
AS
CURSOR actorID_cursor IS
SELECT actorID FROM Actor;
BEGIN
FOR row IN actorID_cursor LOOP
INSERT actorID INTO ACTOR_QUOTES;
INSERT INTO actor_Quotes_NT VALUES ('', NULL, ' ', '');
DELETE (*) FROM actor_Quotes_NT ('', NULL, ' ', '');
END LOOP;
END INIT_ACTOR_QUOTES ;
/
Warning: Procedure created with compilation errors.
SQL> show errors;
Errors for PROCEDURE INIT_ACTOR_QUOTES:
LINE/COL ERROR
-------- -----------------------------------------------------------------
7/2 PL/SQL: SQL Statement ignored
7/9 PL/SQL: ORA-00925: missing INTO keyword
9/2 PL/SQL: SQL Statement ignored
9/10 PL/SQL: ORA-00928: missing SELECT keyword
SQL>
请帮忙......
第一个错误:插入表时,我们必须将值插入所有列,否则只需指定我们要填充的列。
第二个错误:当引用游标中的列时,我们必须引用我们正在获取数据的变量,即您命名不当的示例中的
row
。
第三:填充用户定义类型时,我们必须在赋值中命名该类型。
第四:填充嵌套表时,我们必须命名它及其收集的对象类型。
第五:嵌套表是表上的一列,因此应在 INSERT 语句中分配,或随后使用 UPDATE 分配。
所以你真正想要的是看起来像这样的东西:
insert into ACTOR_QUOTES
(actorid, quote)s
values
( row.actorid
, AQ_NT (
ACTOR_QUOTE_TYPE
('Dirty Harry', 1970, 'Inspector Callahan', 'Do you feel lucky punk?')
, ACTOR_QUOTE_TYPE
('Sudden Impact', 1983, 'Inspector Callahan', 'Make my day')
)
);
顺便说一句,关于命名不当的变量,不要称任何东西为 AQ。这是 Oracle Advance Queuing 功能的公认缩写,因此它只会引起混乱。