具有单个参数的Pl / SQL过程

时间:2012-03-31 13:45:18

标签: plsql procedure

我创建了以下表格...

CREATE TABLE Actor
(Actor_ID CHAR(5),
lastName CHAR(24),
firstName CHAR(24),
/

CREATE TABLE Movie
(movieID CHAR(3) ,
title CHAR(36),
year NUMBER,
/

CREATE TABLE Role
(roleID CHAR(5),
roleName CHAR(36),
actorID CHAR(5),
movieID CHAR(3))
/

CREATE TABLE Quote
(quoteID CHAR(4),
quoteCHAR CHAR(255))
/

CREATE TABLE RoleQuote
(roleID CHAR(5),
quoteID CHAR(4))
/

Then i created this schemas....

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
/

我需要创建一个带有单个参数的过程(ACTORID是过程参数)并将所有电影中的所有引号插入行中(演员可能有很多电影和许多引号,有些对于任何ACTORID,ACTOR_QUOTES表中的QUOTES嵌套表可能没有引号!

我该怎么做?

由于

到目前为止,我试过这个,我不确定它是否正确。

CREATE OR REPLACE PROCEDURE Populate_Movies_Quote
AS
CURSOR Quote_cursor (ActorID in CHAR) IS
SELECT ActorID, Quote, Movie_Title from Actor_Quotes, AQ_NT where  Quotes.ActorID=ActorID;
BEGIN 
FOR row IN Quote_cursor
LOOP
INSERT INTO ACTOR_QUOTES (ActorID, quotes) values (row.ActorID,  AQ_NT(Actor_Quote_Type)); 
END LOOP; 
END Populate_Movies_Quote ;
/ 


Show erros


LINE/COL ERROR
-------- -----------------------------------------------------------------
4/1      PL/SQL: SQL Statement ignored
4/55     PL/SQL: ORA-04044: procedure, function, package, or type is not
     allowed here

6/1      PL/SQL: Statement ignored
6/10     PLS-00306: wrong number or types of arguments in call to
     'QUOTE_CURSOR'

1 个答案:

答案 0 :(得分:0)

这当然看起来很熟悉。我认为其他人也被Paul Judges Assignment困住了。

这里没有为你做这个是我采取的基本策略。

首先编写一个选择查询,该查询按顺序返回给定Actor ID的Movie Title,Movie Year,Role Name和Quote。忘记现在的程序只是让这个select语句工作。这意味着加入where子句中的所有表。

如果你实现了这个目标,那么基本上你需要将所有数据插入到嵌套表中。

您可以使用表函数访问嵌套表以进行插入。如下所示:

INSERT INTO TABLE(SELECT QUOTES FROM Actor_Quotes WHERE ActorID = Actor_ID)

其中“Actor_ID”是过程参数的名称。 PL / SQL实际上允许您直接从select语句插入表值。您只需确保select语句返回的值与insert语句所期望的顺序和类型相匹配。这非常方便,因为它意味着不需要游标循环。所以你基本上所要做的就是把我之前写的select语句直接放在上面的insert语句下面,你应该对它进行排序。确保在select查询中使用相同的Actor_ID参数。