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.

Reply via email to