#db2
Вопрос:
CREATE OR REPLACE PROCEDURE qqq ()
P1: BEGIN
Declare cID char(5) ;
Declare cc char(5) ;
Declare SQLSTATE char(5) default '00000' ;
declare stmt varchar(1000) ;
declare c1 cursor for s1 ;
set cid = 'b' ;
Set stmt = 'select * from aaa where a = ?' ;
prePare s1 from stmt ;
open c1 using cid ;
ins_loop :
Loop
fetch c1 into cc ;
if SQLSTATE <> '00000' then LEAVE ins_loop ; end if ;
insert into bbb (aa) values ('3' || cc) ;
end loop ins_loop;
close c1 ;
commit ;
END P1
После запуска таблица bbb пуста. ЕСЛИ это правильно, то таблица bbb содержит 2 строки. Потому что запрос ( выберите * из aaa, где a = ‘b’ ) содержит 2 строки.
Комментарии:
1. Не воспроизводимо. Узнайте, как использовать отладчик для одношагового просмотра кода во время выполнения и изучения переменных. Ваш симптом (отсутствие вставленных строк) возникнет, если курсор не вернет никаких данных. Если вы не умеете отлаживать, то все не так, как кажется
2. если в AAA более 1 столбца и у вас действительно есть
select *
значение sqlstate, то, вероятно, значение sqlstate01503
после выборки, что означает, что вы должны выбрать нужный столбец только иLEAVE
только тогда, когдаSQLSTATE
= 02000 (см. Здесь )3. Почему он не показывает ошибку ( SQLSTATE ) при запуске скрипта
4. здесь нет причин использовать курсор. Вы можете напрямую вставить результаты инструкции select.
insert into bbb (aa) select '3' concat column_name from aaa where a = cid;
Ответ №1:
Вы получаете SQLSTATE = 01503, если ваша таблица содержит более 1 столбца. Это предупреждение (не исключение), поэтому ваш SP продолжает свое выполнение.
Вместо этого либо используйте, select column_name from ...
либо измените SQLSTATE <> '00000'
условие соответствующим образом.
P.S.: не используйте commit
в своем SP, если это действительно не обязательно. В данном случае это не имеет значения, но лучше, когда вызывающее приложение управляет транзакциями.