Оператор EXECUTE IMMEDIATE: ORA-00984: столбец здесь запрещен - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь выполнить код ниже.Я создал массив и хочу вставить каждый элемент этого массива в существующую таблицу.Я использовал для этого цикл.Но я получаю следующую ошибку: «ORA-00984: столбец здесь не разрешен».Что я делаю не так?

DECLARE
   TYPE array_status IS VARRAY(2) OF VARCHAR2(30); 
   ARRAY array_status := array_status('Planned', 'Finished');
BEGIN
   FOR i IN 1..ARRAY.COUNT LOOP
   EXECUTE IMMEDIATE 'INSERT INTO STATUS_DIM(STATUSNAAM) VALUES(' || ARRAY(i) || ')'; 
      dbms_output.put_line(array(i));
   END LOOP;
END;

1 Ответ

0 голосов
/ 04 декабря 2018

Вы объединяете значение в строку SQL, что приводит к чему-то вроде этого: INSERT INTO STATUS_DIM(STATUSNAAM) VALUES(Planned);, но значения должны быть заключены в одинарные кавычки: INSERT INTO STATUS_DIM(STATUSNAAM) VALUES('Planned');

Правильное решение - использовать переменную связывания:

DECLARE
   TYPE array_status IS VARRAY(2) OF VARCHAR2(30); 
   ARRAY array_status := array_status('Planned', 'Finished');
BEGIN
   FOR i IN 1..ARRAY.COUNT LOOP
   EXECUTE IMMEDIATE 'INSERT INTO STATUS_DIM(STATUSNAAM) VALUES(:status)' using array(i); 
      dbms_output.put_line(array(i));
   END LOOP;
END;
/

Тогда вам не нужно думать о цитировании.

На самом деле для этого вообще не нужен динамический SQL:

DECLARE
   TYPE array_status IS VARRAY(2) OF VARCHAR2(30); 
   ARRAY array_status := array_status('Planned', 'Finished');
BEGIN
   FOR i IN 1..ARRAY.COUNT LOOP
     INSERT INTO STATUS_DIM(STATUSNAAM) VALUES(array(i)); 
     dbms_output.put_line(array(i));
   END LOOP;
END;
/

Однако наиболее эффективным решением является использование FORALL вместо цикла.

DECLARE
   TYPE array_status IS VARRAY(2) OF VARCHAR2(30); 
   ARRAY array_status := array_status('Planned', 'Finished');
BEGIN
   FORALL i IN 1..ARRAY.COUNT 
     INSERT INTO STATUS_DIM(STATUSNAAM) VALUES(array(i)); 
END;
/

Это будет быстрее, чем "простой цикл", но имеет недостаток, который вы не можете использовать dbms_output для вывода.

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