Você está na página 1de 2

CONTROLE DE TRANSAO EM PROCEDURES

1- Uma rotina SPL criar um UPDATE CURSOR (cursor para atua i!a"#o$ automaticam%nt% s% &%ntro &o 'OREAC( uma &%c ara"#o UPDATE ou DELETE usar a c ausu a )(ERE CURRENT O'* S% +or uti i!a&a a c ausu a )(ERE CURRENT O', &%-%-s% %.p icitam%nt% r%+%r%nciar o cursor &a &%c ara"#o 'OREAC(, % po&%-s% co ocar a &%c ara"#o /E01N )OR2 ant%s &a &%c ara"#o 'OREAC( % um COMM1T )OR2 &%pois &o END 'OREAC(* E.%mp o3 BEGIN WORK; FOREACH sal_cursor FOR SELECT salary INTO s FROM employee WHERE salary > 35000; LET s = s + s * ( pct/100 ); UPDATE employee SET salary = s WHERE CURRENT OF sal_cursor END FOREACH; COMMIT WORK; OBS. No exemplo acima, o COMMIT somente ser executado aps a leitura e execuo de todas as linhas do cursor. Ou se a, todas as atuali!a"es sero #eitas em uma $nica transao, o %ue no & recomend'el para (randes %uantidades de linhas, por%ue poder ocasionar um )BO*T na transao por +ON, T*)NS)CTION. Para ca&a int%ra"#o &% oop &o 'OREAC(, um no-o oc4 5 r%6u%ri&o (s% -oc7 usar oc4 no n8-% &% ro9 ( in:a$$* A &%c ara"#o COMM1T )OR2 i;%ra to&as as in:as ( oca&as$ % (COMM1T to&as as in:as atua i!a&as como uma transa"#o simp %s$ &%pois &a < tima int%ra"#o &% oop &o 'OREAC(* Para ap icar o COMM1T %m uma in:a atua i!a&a &%pois &% ca&a int%ra"#o &o oop, &%-%-s% a;rir o cursor com )1T( (OLD, % inc uir a &%c ara"#o /E01N )OR2 % COMM1T )OR2 &%ntro &o oop &o 'OREAC( como no %.%mp o &% rotina SPL a;ai.o* A rotina s%ria =up&at%($ %.%cuta um COMM1T %m ca&a in:a como uma transa"#o s%para&a* E.%mp o3 CREATE PROCEDURE serial_update(); DEFINE p_col2 INT; DEFINE i INT; LET i = 1; FOREACH cur_su WITH HOLD FOR SELECT col2 INTO p_col2 FROM customer WHERE 1=1; BEGIN WORK; UPDATE customer SET col2 = p_col2 WHERE CURRENT OF cur_su COMMIT WORK; LET i = i+1 END FOREACH END PROCEDURE;

OBS. No exemplo acima, os comandos B-,IN - COMMIT .O*/ #oram colocados dentro do 0O*-)C1 2o %ue no era permitido at& a 'erso anterior do IN0O*MI34, permitindo %ue se a #eito um COMMIT da transao a cada linha processada dentro do cursor. Isso nos permitir uma maior controle da transao dentro de um cursor nas STO*),- 5*OC-67*-S, e'itando o )BO*T da transao por +ON, T*)NS)CTION. O8ser'e %ue a clausula 9.IT1 1O+6: & o8ri(atria para %ue o cursor continue a8erto aps a execuo de um COMMIT .O*/, caso contrrio, o cursor ser #echado, impedindo %ue o prximo re(istro se a lido dentro do cursor.

Você também pode gostar