2012-03-31 47 views
0

我已創建了以下表/ SQL程序...PL單參數

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' 
+1

[你到目前爲止嘗試過什麼?](http://mattgemmell.com/2008/12/08/what-have-you-tried)。我也推薦[問]。 – Ben 2012-03-31 13:49:37

+0

如果這是家庭作業,請將其標記爲 – 2012-04-01 07:03:19

+0

或多或少重複http://stackoverflow.com/questions/9946383/pl-sql-procedure-using-cursor-loops-and-single-parameter和http: /stackoverflow.com/questions/9929058/sql-procedure-cursor-loops和http://stackoverflow.com/questions/9928363/pl-sql-cursor-loops如果這是一個任務,你們應該學習搜索或(甚至更好)只是彼此交談。 – 2012-04-01 17:20:07

回答

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語句返回的值與插入語句所期望的順序和類型相匹配。這非常方便,因爲它意味着不需要遊標循環。所以基本上所有你需要做的就是放置我剛纔寫的select語句直接在上面的insert語句的下面,你應該排序。請確保您在選擇查詢中使用相同的Actor_ID參數。

+0

從Actor_Quotes,AQ_NT中選擇ActorID,Movie_Title,Year,Role,Quote,其中Actor_Quotes.ActorID = AQ_NT.ActorID;這是對的嗎 ? – Shaan 2012-03-31 20:32:06

+0

不完全。請記住,您要從原始表格中選擇數據並將其插入稍後在作業中創建的新嵌套表格中。您可能必須使用別名,並確保您注意所需的字段。 – philb28 2012-04-01 21:32:45

+0

從Actor a,Movie m,RoleQuote rq,Quote q,Role r where以及a中選擇a.ActorID,a.lastName,a.firstName,a.middleName,m.title,m.year,r.roleName,q.quoteCHAR和q.QuoteID = rq.QuoteID and rq.RoleID = r.RoleID and r.MovieID = m.MovieID and a.ActorID = R.ActorID;這是否正確 – Shaan 2012-04-03 15:35:38