#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;