Синтаксис insert ... values
:
insert into sometable (col1, col2, col3)
values (value1, value2, value3);
В вашем коде отсутствуют оба набора скобок.
Существует вариант PL / SQL-only вкоторый предложение values
заменяется записью PL / SQL:
insert into sometable (col1, col2, col3)
values plsqlrecord;
У него нет скобок вокруг выражения значений, но это должна быть запись PL / SQL, обычно sometable%rowtype
,который v_refnr
не является, следовательно, сообщение об ошибке.
Кроме того, конструкция цикла *1017* Cursor FOR неявно генерирует свою собственную запись, в данном случае r_book
в вашем цикле, и вашдругое r_book
, заявленное вверху, не используется.Поэтому исправленная версия будет выглядеть примерно так:
declare
v_refnr number;
cursor c_book is
select col1, col2, col3 from book;
begin
v_refnr := get_refnr;
for r_book in c_book loop
insert into some_tbl (col1, col2, col3)
values (v_refnr, col2, col3);
end loop;
end;
, хотя я бы предпочел избавиться от объявления курсора, переместив запрос в строку:
declare
v_refnr number;
begin
v_refnr := get_refnr;
for r_book in (
select col1, col2, col3 from book
)
loop
insert into some_tbl (col1, col2, col3)
values (v_refnr, col2, col3);
end loop;
end;
Я также улучшилобработка ошибок путем удаления обработчика исключений when others
, который не делал ничего полезного.Обработка по умолчанию необработанного исключения состоит в том, чтобы напечатать стек ошибок с номерами строк и откатить транзакцию до начала блока, и попытка закодировать это самостоятельно никогда не будет такой хорошей, потому что вы потеряете исходный номер строки и затем блокПохоже, что завершается успешно, хотя на самом деле это не так, не говоря уже о том, что нет смысла урезать сообщение об ошибке до 250 символов.
Это оставляет три возможных проблемы:
Вы генерируете свой номер только один раз вверху, а не один раз для каждой вставленной строки.Возможно, это и есть намерение, но если нет, то вам следует переместить вызов функции внутри цикла.
Если все, что get_refnr()
делает, это генерирует последовательное число, Oracle уже предоставляет метод для выполнениякоторый называется последовательность , или, что еще лучше, столбец идентификаторов .
Если единственной целью цикла является вставка строк из вашегоselect
, как указывал Каушик Наяк, вы можете сделать это в обычном SQL, используя синтаксис insert ... select
без необходимости использования циклов, переменных и т. Д., И это будет проще и быстрее.