Процедура Pl / SQL с одним параметром - PullRequest
0 голосов
/ 31 марта 2012

Я создал следующие таблицы ...

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,в строку (строки) (у актера может быть много фильмов и много цитат, у некоторых может не быть цитат!) вложенной таблицы QUOTES в таблице ACTOR_QUOTES для любого ACTORID.

Как мне это сделать?

Спасибо

Пока я пробовал это, я не уверен, что это правильно или нет.

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 голосов
/ 31 марта 2012

Это, конечно, выглядит знакомо.Я полагаю, что кто-то еще застрял с Полом Судейским заданием.

Без этого для вас вот основная стратегия, которую я выбрал.

Сначала просто напишите запрос на выборку, который возвращает название фильма, год фильма, Имя роли и цитата для данного идентификатора актера в указанном порядке.Забудьте о процедуре, пока просто сделайте этот оператор выбора работающим.Это означает объединение всех таблиц в предложении where.

Если вы достигнете этого, у вас в основном будут все данные, которые необходимо вставить во вложенную таблицу.

Вы можете получить доступ к вложенной таблицедля вставки с помощью табличной функции.Так что-то вроде:

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

Где "Actor_ID" - это имя параметра вашей процедуры.PL / SQL фактически позволяет вставлять в таблицу значения непосредственно из оператора select.Вы просто должны убедиться, что значения, возвращаемые оператором select, соответствуют порядку и типу, ожидаемым вашим оператором вставки.Это очень удобно, поскольку это означает, что нет необходимости в цикле курсора.Поэтому, по сути, все, что вам нужно сделать, это поместить оператор select, который я сказал написать ранее, непосредственно под оператором вставки выше, и вы должны быть отсортированы.Убедитесь, что вы используете тот же параметр Actor_ID в вашем запросе выбора, хотя.

...