ORA-00917: Отсутствует запятая в PLSQL - PullRequest
0 голосов
/ 23 апреля 2019

Я написал сценарий pl sql для добавления значений, хранящихся в массиве, во временную таблицу. Я использовал «Выполнить немедленно» для выполнения запроса вставки внутри цикла.

Я проверил количество одинарных кавычек и количество запятых, и они закрыты. Тем не менее я получаю код ошибки ORA-00917: отсутствует запятая.

declare
   type post_CODS IS VARRAY(34) OF VARCHAR2(20); 
   type locality_ID IS VARRAY(34) OF NUMBER(9); 
   pc post_CODS; 
   Y varchar2(1);
   lid locality_ID; 
   total integer;
begin
   Y := 'Y'; 
   lid := locality_ID(2380,3785,8710,17895,20345,24630,26814,28525,29130,31025,31265,32445,36940,40590,54290,83775,83780,83785,83790,83795,88483,93480,94560,96670,1000524,1000628,1000738,1000857,1000988,1001103,1001466,1001575,1001707,1001744);
   pc := post_CODS(2822,2739,2822,2372,2817,4314,4300,4726,4300,4884,4314,4314,4300,5719,3026,4314,4314,4314,4314,4314,873,2582,2817,4314,5723,5440,2083,2575,873,2372,5440,5440,5715,5440);
   total := lid.count;
   FOR i in 1 .. total LOOP 
      execute immediate 'insert into tmp_ref_lc_pc_cods values('||lid(i)||','||pc(i)||','||Y||',89987,'||sysdate||')';  
   END LOOP; 
END;

Это ошибка, которую я получаю

ORA-00917: missing comma
ORA-06512: at line 14
00917. 00000 -  "missing comma"

Я работаю в оракуле.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Хорошая хитрость при попытке немедленного выполнения - убедиться, что созданные операторы отформатированы правильно, печать написанного вами кода показывает, что Y не находится внутри апострофов

insert into tmp_ref_lc_pc_cods values(2380,2822,Y,89987,23-APR-19)

Так что при динамическомпри создании кода убедитесь, что все созданные строки имеют правильное количество апострофов.

dbms_output.put_line('insert into tmp_ref_lc_pc_cods values('||lid(i)||','||pc(i)||','''||Y||''',89987,'||sysdate||')');
0 голосов
/ 23 апреля 2019

Оберните ваш insert оператор в q'[]' и попробуйте

execute immediate q'[insert into tmp_ref_lc_pc_cods values('||lid(i)||','||pc(i)||','||Y||',89987,'||sysdate||')]';  

Обновление

Рекомендуется использовать bind variable.Вы можете попробовать ниже.Это работает для меня и вставки данных.

declare
   type post_CODS IS VARRAY(34) OF NUMBER(20); 
   type locality_ID IS VARRAY(34) OF NUMBER(9); 
   pc post_CODS; 
   Y varchar2(1);
   lid locality_ID; 
   total integer;
begin
   Y := 'Y'; 
   lid := locality_ID(2380,3785,8710,17895,20345,24630,26814,28525,29130,31025,31265,32445,36940,40590,54290,83775,83780,83785,83790,83795,88483,93480,94560,96670,1000524,1000628,1000738,1000857,1000988,1001103,1001466,1001575,1001707,1001744);
   pc := post_CODS(2822,2739,2822,2372,2817,4314,4300,4726,4300,4884,4314,4314,4300,5719,3026,4314,4314,4314,4314,4314,873,2582,2817,4314,5723,5440,2083,2575,873,2372,5440,5440,5715,5440);
   total := lid.count;
   FOR i in 1 .. total LOOP 
      execute immediate q'[insert into tmp_ref_lc_pc_cods values(:var1,:var2,'Y',89987,sysdate)]' using lid(i),pc(i);  
   END LOOP; 
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...