sql оракул.петли курсора процедуры - PullRequest
1 голос
/ 05 марта 2012

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

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
/

Мне нужно создать .....

PL / SQL-процедуру INIT_ACTOR_QUOTES без параметровчто:

Считывает ВСЕ ACTORID из таблицы ACTOR и вставляет их в атрибут ACTORID для каждой строки таблицы ACTOR_QUOTES (таблицы имеют одинаковое количество элементов) и в то же время вставляет следующие начальные значения в первоетолько строка вложенной таблицы QUOTES в каждой строке таблицы ACTOR_QUOTES;

(Movie_Title, Year, Role, Quote) соответственно установлены в ('', NULL, '', '')

Также и одновременно сразу после каждого ВСТАВЛЕНИЯ используйте DELETE, чтобы удалить ВСЕ строки из вложенной таблицы в каждой строке, принадлежащей каждому ACTORID в таблице ACTOR_QUOTES.

Я получаю ошибку компиляции с кодом ....

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> 

Любая помощь, пожалуйста ....

1 Ответ

3 голосов
/ 05 марта 2012

Первая ошибка: при вставке в таблицу мы должны вставить значения в все столбцы или просто указать те, которые мы заполняем.

Вторая ошибка: при ссылке на столбец вкурсор в котором мы должны ссылаться на переменную, в которую мы извлекаем данные, например row в вашем примере с неназванным именем.

В-третьих: при заполнении пользовательского типа мы должны назвать тип в присваивании.

Четвертый: при заполнении вложенной таблицы мы должны назвать как ее, так и тип объекта, который она собирает.

Пятое: вложенная таблица - это столбец в таблице, поэтому ее следует назначать в операторе INSERT или субэквивалентно с помощью ОБНОВЛЕНИЯ.

То, что вам действительно нужно, выглядит примерно так::

 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, так что это может привести к путанице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...