En cuanto a la primera pregunta, yo utilizo el ROW_COUNT. En teoría
según la documentación de IBM, debería ser lo mismo:
https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/db2/rbafzfielddescsqlca.htm
En cuanto al bucle, yo uso "casi" la misma técnica que Javier.
La diferencia es que el cursor lo defino desplazable (declare scroll
cursor) y la fetch antes del bucle, en lugar de con fetch next, la hago
con fetch first.
De ese modo me aseguro de que, incluso aunque el cursor estuviera ya
abierto y hubiera realizado alguna lectura por cualquier causa, siempre
me recupera el primer registro de la select.
Saludos.
Juan Carlos
---
https://paredes.info
[email protected]
El 16/06/2020 09:38, datil400 escribió:
Hola Alberto,
respecto a la primera pregunta no lo tengo muy claro, pero creo que
son equivalentes.
La segunda duda la tengo más clara. Con colegas y compañeros siempre
hemos discutido sobre la mejor fórmula para construir un bucle de
lectura. A casi todos les gusta la estructura que muestras en el
correo. A mí no, le veo muchos inconvenientes. Yo construyo los
bucles así (usando tu ejemplo):
exec sql fetch next from @cursor into :@sortida;
dow sqlcod <> 100 and sqlcod >= 0;
hacer_cosas();
exec sql fetch next from @cursor into :@sortida;
enddo;
Lo veo mucho más simple, mucho más limpio y, en tu caso, la
comparación del dow no se ve afectada por una tercera sentencia SQL
dentro de hacer_cosas().
Al final se trata más de gustos personales que de otra cosa, ¿cual
es el mejor bucle? Yo lo tengo claro.
Saludos,
Javier Mora
El mar., 16 jun. 2020 a las 8:29, Alberto Martinez
(<[email protected]>) escribió:
Buenos dias. Tengo un par de dudas de SQL que las estoy haciendo
mecánicamente hace mucho y hace tiempo que pienso en consultarlo
al Foro a ver cómo lo véis.
Lo primero es, para saber las líneas afectadas en un Insert delete
o update, ¿es lo mismo usar @VARIABLE=SQLERRD(3) (o
@variable=Sqlerr3) que GETDIAGNOSTICS: @VARIABLE=ROW_COUNT?
Y luego otra:
Supongo que todos hacemos bucles del tipo:
Dow Sqlcod<>100 and Sqlcod>=0;
Exec Sql Fetch Next from @cursor into :@Sortida;
If Sqlcod<>100 and Sqlcod>=0;
hacer_cosas();
ENDIF;
Enddo;
El caso es que si HACER_COSAS() es por ejemplo otra selección SQL
que por lo que sea no encuentra un valor , nos cambia el valor del
SQLcod y nos manda el bucle al traste.
Yo lo que hago es guardarme el valor del Sqlcod antes de llamar a
HACER_COSAS() y luego dejarlo como estaba.
Pero... hay otra manera pelín más elegante?
Gracias!! ____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.
____________________________________________________
�nete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 � Publicaciones Help400, S.L.
____________________________________________________
nete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 Publicaciones Help400, S.L.