ORA-06550: строка 10, столбец 14: PLS-00201: должен быть объявлен идентификатор «ЭЛЕМЕНТ НАБОРА ОБНОВЛЕНИЙ TEST2».

#sql #oracle #plsql

Вопрос:

 create table test1(item varchar2(10),level1 number(10,0),des varchar2(10));  create table test2(l_update varchar2(2000),l_item varchar2(10));   declare   l_item varchar2(10); l_update varchar2(2000);  cursor p1 IS select * from TEST1;  Begin l_update := "UPDATE TEST2 SET ITEM" ;  open p1; fetch p1 into l_item;  insert into test2 values('l_update','123');  close p1;  END;  

Я получаю эту ошибку:

ORA-06550: строка 10, столбец 14:
PLS-00201: должен быть объявлен идентификатор «ЭЛЕМЕНТ НАБОРА ОБНОВЛЕНИЙ TEST2».

Комментарии:

1. l_update := "UPDATE TEST2 SET ITEM" ; должно быть l_update := 'UPDATE TEST2 SET ITEM'; в одинарных кавычках. l_item и l_update никогда не используются. insert into test2 values('l_update','123'); вставляет статические значения.

Ответ №1:

Как уже отмечалось, вы должны были использовать одинарные кавычки и удалить их (одинарные кавычки) из insert заявления.

Но это еще не все: test1 содержит 3 столбца; вы не можете извлечь 3 столбца в одну l_item переменную (вам не хватает еще двух переменных); вы бы предпочли объявить переменную курсора, например l_curvar c1%rowtype; .

Кроме того, что делать, если test1 содержит более одной строки? Вы всегда выбираете первый (случайный), делаете что-то и закрываете курсор.

Лучший/более простой вариант — использовать FOR цикл курсора и позволить Oracle выполнять большую часть «грязной» работы за вас (поскольку вам не нужно объявлять переменную курсора, открывать курсор, извлекать из него (если вы находитесь в цикле-выйдите из цикла), закройте курсор).

Что-то вроде следующего примера.

Тестовые таблицы:

 SQLgt; create table test1  2 (item varchar2(10), level1 number(10,0), des varchar2(10));  Table created.  SQLgt; create table test2  2 (l_update varchar2(2000), l_item varchar2(10));  Table created.  SQLgt; insert into test1 (item, level1, des) values  2 ('A', 1, 'Test');  1 row created.  SQLgt; select * from test1;  ITEM LEVEL1 DES ---------- ---------- ---------- A 1 Test  SQLgt; select * from test2;  no rows selected  

Код:

 SQLgt; declare  2 l_update varchar2(2000);  3 begin  4 l_update := 'UPDATE TEST2 SET ITEM';  5  6 for cur_r in (select item, level1, des from test1) loop  7 insert into test2 (l_update, l_item) values  8 (l_update , cur_r.item);  9 end loop;  10 end;  11 /  PL/SQL procedure successfully completed.  

Результат:

 SQLgt; select * from test2;  L_UPDATE L_ITEM -------------------------------------------------- ---------- UPDATE TEST2 SET ITEM A  SQLgt;