Запрос на обновление в анонимном блоке дает ошибку, но работает вне его?
Пробую добавить столбец таким скриптом:
ALTER TABLE MY_TABLE ADD new_id number;
DECLARE
MAX_ID NUMBER;
BEGIN
SELECT max(id) INTO MAX_ID FROM some_table;
EXECUTE IMMEDIATE 'CREATE sequence temp_seq start WITH '||MAX_ID||' increment by 1';
UPDATE MY_TABLE SET new_id = temp_seq.nextval;
END;
/
Получаю ошибку:
Error report -
ORA-06550: line 6, column 34:
PL/SQL: ORA-02289: sequence does not exist
Но если выполнить обновление после PL/SQL блока, то оно работает:
DECLARE
MAX_ID NUMBER;
BEGIN
SELECT max(id) INTO MAX_ID FROM some_table;
EXECUTE IMMEDIATE 'CREATE sequence temp_seq start WITH '||MAX_ID||' increment by 1';
END;
/
UPDATE MY_TABLE SET new_id = temp_seq.nextval;
Почему обновление внутри блока дает ошибку?
Свободный перевод вопроса Update within anonymous block fails but works out of it от участника Rohit
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Перед выполнением PL/SQL блок компилируется и все идентификаторы в статических запросах должны быть известны. Последовательность temp_seq в этот момент не существует.
Сделать надо так:
create table tab (id int, memo varchar2 (96))
/
alter table tab add new_id number
/
col maxid new_value maxid noprint
select 999 maxid from dual
/
create sequence temp_seq start with &maxid nocache
/
begin
update tab set new_id = temp_seq.nextval;
end;
/
PL/SQL procedure successfully completed.