【问题标题】:Pl/SQL procedure with single Parameter具有单个参数的 Pl/SQL 过程
【发布时间】:2012-03-31 13:45:18
【问题描述】:

我已经创建了以下表格...

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 的所有电影中的所有引号插入到行中(一个演员可能有很多电影和很多引号,有些可能没有引号!)的任何 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'

【问题讨论】:

标签: plsql procedure


【解决方案1】:

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

不为你做这件事,这是我采取的基本策略。

首先只需编写一个选择查询,按该顺序返回电影标题、电影年份、角色名称和给定演员 ID 的报价。现在忘记这个过程,让这个 select 语句工作。这意味着在 where 子句中连接所有表。

如果你做到了,那么你基本上就拥有了所有需要插入到嵌套表中的数据。

您可以使用 table 函数访问嵌套表以进行插入。所以像:

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

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

【讨论】:

  • 从 Actor_Quotes、AQ_NT 中选择 ActorID、Movie_Title、年份、角色、引用,其中 Actor_Quotes.ActorID=AQ_NT.ActorID;对吗?
  • 不完全。请记住,您是从原始表中选择数据并将其插入到稍后在分配中创建的新嵌套表中。您可能必须使用别名并确保注意所需的字段。
  • Select a.ActorID, a.lastName, a.firstName, a.middleName, m.title, m.year, r.roleName, q.quoteCHAR from Actor a, Movie m, RoleQuote rq,引用 q, Role r where and q.QuoteID=rq.QuoteID and rq.RoleID = r.RoleID and r.MovieID = m.MovieID and a.ActorID= R.ActorID;对不对
  • 你试过了吗?它是否为您提供了需要插入到嵌套表中的项目?我不会为你做的。
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多