Переменная курсора цикла в DB2

#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, то, вероятно, значение sqlstate 01503 после выборки, что означает, что вы должны выбрать нужный столбец только и 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, если это действительно не обязательно. В данном случае это не имеет значения, но лучше, когда вызывающее приложение управляет транзакциями.