SQL обработчик продолжения не запущен - PullRequest
0 голосов
/ 21 апреля 2020

IBM i V7R1M0. Мне нужно продолжать обрабатывать оператор всякий раз, когда возникает ошибка и насколько я прочитал, например, из этого:

https://dba.stackexchange.com/questions/88862/how-to-ignore-sql-errors-in-stored-procedure-not-handle

DECLARE CONTINUE HANDLER кажется будь ответом, поэтому

У меня есть очень простая процедура, которая выглядит следующим образом:

exec SQL create or replace procedure test_prod1   
         (in test2 decimal(1,0))                  
         language sql modifies sql data           
         begin                                    
         declare continue handler for sqlexception
            begin end;                            

         update DUPEPF set INT2 = test2;          
         end;                                     

Насколько я могу судить, это означает, что когда происходит ошибка (например, нарушение уникального ключа) ) оператор SQL просто продолжится, но это не так. Оператор останавливается всякий раз, когда появляется нарушение ключа, и следующие строки не обрабатываются. Я не понимаю, почему это так

1 Ответ

1 голос
/ 22 апреля 2020

Ваш обработчик продолжения работает ...

Ваша процедура игнорирует ошибку, выданную оператором UPDATE, и продолжает работу. За исключением того, что больше ничего не нужно делать.

То, что ваш профессионал c игнорирует ошибку, не означает, что БД может игнорировать ошибку внутри обработки оператора обновления.

* Обработчики 1007 * EDIT
изменяют способ обработки ошибок хранимой процедурой или UDF ... воспринимают их как способ "отловить" ошибки, выдаваемые БД. Они не мешают БД генерировать эти ошибки в первую очередь

Имеет смысл?

Для того, чтобы делать то, что вы пытаетесь сделать, вы ' мне нужно использовать собственный курсор, что-то вроде этого ...

     create or replace procedure test_prod1   
     (in test2 decimal(1,0))                  
     language sql modifies sql data           
     begin           
     declare myInt integer;
     DECLARE DUPLICATE_KEY CONDITION FOR SQLSTATE '23505';
     DECLARE END_OF_TABLE CONDITION FOR SQLSTATE '02000';
     declare test_cursor cursor for
        select int2 from DUPEPP for update;
     declare exit handler for END_OF_TABLE
        close test_cursor;                         
     declare continue handler for DUPLICATE_KEY
        begin end;                            


     open test_cursor;
     fetch_loop:
     LOOP
       fetch next from test_cursor into myInt;
       update dupepf set int2 = test2
         where current of test_cursor;
     END LOOP fetch_loop;
     end;
...