Динамический SQL внутри курсора - PullRequest
4 голосов
/ 22 августа 2010

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

Запрос:

DECLARE
   CURSOR c1 is select distinct WP_NO from temp;
   cnum VARCHAR2(255);

BEGIN

  FOR cnum in c1 
  LOOP
    EXECUTE IMMEDIATE 'Alter table temp_col add (:1 varchar2(255))' using cnum;
  END LOOP;  

  COMMIT;

END;

Ошибка:

PLS-00457: выражения должны быть типов SQL

Ответы [ 2 ]

4 голосов
/ 22 августа 2010

Это происходит потому, что переменные связывания недопустимы в инструкциях DDL .

Попробуйте попробовать это без использования переменной bind:

DECLARE
  CURSOR c1 is select distinct WP_NO from temp;
  cnum VARCHAR2(255);
BEGIN
  FOR cnum in c1 
  LOOP
    EXECUTE IMMEDIATE 'Alter table temp_col add ('|| cnum ||' varchar2(255))';
  END LOOP;  

  COMMIT;
END;
0 голосов
/ 22 августа 2010

У вас есть конфликт с символом cnum , который используется как в качестве локальной переменной, так и для текущей строки курсора.

Вы, вероятно, хотите это:

DECLARE
   CURSOR c1 is select distinct WP_NO from temp;

BEGIN

  FOR current_row in c1 
  LOOP
    EXECUTE IMMEDIATE 'Alter table temp_col add (:1 varchar2(255))' using current_row.WP_NO;
  END LOOP;  

  COMMIT;

END;

Как видите, вам не нужно объявлять переменную current_row , которую вы используете в цикле for.

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