Select con REXX

Todo lo relacionado con REXX en este ambiente.
Responder
qwe2
Usuario avanzado
Usuario avanzado
Mensajes: 60
Registrado: 21 Ene 2015, 16:13
País: Argentina
Ciudad: CABA
Ocupación: Analista de desarrollo

Select con REXX

Mensaje por qwe2 » 23 Feb 2018, 21:44

Que tal? estoy tratando de hacer un CLIST/REXX que consulte una tabla sysibm con un where que paso por parametro al rexx. Alguien tiene un ejemplo de como podria hacerlo? estuve buscando ejemplos en foros en ingles pero encontré algunos muy viejos y no estoy seguro de que funcionen.
Si tienen alguno a mano mejor, sino, en todo caso, mas tarde armo lo que tengo y lo posteo a ver si alguno puede darme una mano.
Gracias por leer :sombrero:

qwe2
Usuario avanzado
Usuario avanzado
Mensajes: 60
Registrado: 21 Ene 2015, 16:13
País: Argentina
Ciudad: CABA
Ocupación: Analista de desarrollo

Re: Select con REXX

Mensaje por qwe2 » 24 Feb 2018, 13:08

Por el momento tengo esto:

Código: Seleccionar todo

/* REXX */                                                      
TRACE O                                                         
MAIN:                                                           
                                                                
ADDRESS TSO "SUBCOM DSNREXX"                                    
IF RC <> 0 THEN DO                                              
  S_RC = RXSUBCOM('ADD','DSNREXX','DSNREXX')                    
  IF S_RC <> 0 THEN DO                                          
    SAY 'EL AMBIENTE NO RESPONDE, INTENTE MAS TARDE'            
    EXIT                                                        
  END                                                           
END                                                             
                                                                
ssid = 'DSNB'                                                   
ADDRESS DSNREXX "CONNECT" ssid                                  
IF SQLCODE ¬= 0 THEN CALL SALERROR 'CONNECT'        
El problema es que me esta dando un SQLCODE -922, SQLERRMC = PLAN ACCESS 00F30034, SQLERRP = DSNAET03, SQLSTATE= 42505... Si alguien tiene una idea de porque puede ser se los agradeceria.

PD: Comprobe que en el SPUFI el DSNB es el que usamos en desarrollo para hacer querys.

qwe2
Usuario avanzado
Usuario avanzado
Mensajes: 60
Registrado: 21 Ene 2015, 16:13
País: Argentina
Ciudad: CABA
Ocupación: Analista de desarrollo

Re: Select con REXX

Mensaje por qwe2 » 27 Feb 2018, 15:35

Hable con la mis DBA's y me dijeron basicamente que ahora no hay posibilidad de conectarse desde REXX a DB2, asi que ese camino esta cerrado. Pienso que puedo hacer 2 cosas (2 entre varias, pero se me ocurren 2 simples por lo menos). 1) hacer que el rexx invoque a un jcl que ejecute un paso de BMC que haga el unload que yo quiero de las tablas sysibm, o 2) Hacer un pgm cobol con DB2 que con un cursor que haga lo que yo quiero y que el REXX lo ejecute.
Los problemas/dudas que tengo son: Para el 1, cuando ejecuto el jcl y quiero mostrar la salida con un browse me da un error de archivo en uso por otra tarea (y eso que el jcl termino con 0 antes de hacer el browse (si alguien puede darme una mano pongo lo que tengo y me dan alguna pista de lo que puede ser). Y para el 2 tengo varias preguntas, es mejor (digo en cuestion de velocidad) ejecutar un pgm cobol que se ejecuta en el momento que mandar una tarea a la cola del spool? Otra pregunta es como hago el include de las tablas sysibm que quiero usar; que copys tienen? donde deberian estar?

En fin, si alguno me puede dar su opinion sobre lo que quiero hacer acepto comentarios, nunca hice algo como esto y estoy yendo medio a ciegas.
Gracias por todo!

Avatar de Usuario
jlanderos
Usuario
Usuario
Mensajes: 18
Registrado: 26 Sep 2017, 18:21
País: México
Ciudad: CDMX
Ocupación: IT Specialist

Re: Select con REXX

Mensaje por jlanderos » 06 Mar 2018, 05:18

Hola:

Me parece que en el ejemplo que envías hace falta primero validar la conexión con DB2 y después de ello comenzar a trabajar con sentencias...

Hice un rápido proceso para conectar a DB2 y validar su ambientación:

Código: Seleccionar todo

/* REXX */                                              
                                                        
call DB2_ChkConn                                        
                                                        
if result then                                          
  say 'Falla en ambientación.'                          
else                                                    
  call DB2_Connect('<<SSID Name>>')                              
                                                        
exit(abs(result))


DB2_ChkConn:

say 'DSNREXX: Evaluando ambientación...'                  
"SUBCOM DSNREXX"  /* Verifica ambientación a DSNREXX      
                     0. Ambientación existente.           
                     1. Ambientación inexistente.    */   
if rc then do                                             
  say 'RXSUBCOM: Ambientando...'                          
  call RXSUBCOM 'ADD', 'DSNREXX', 'DSNREXX'               
  say 'DSNREXX: Validando ambientación...'                
  "SUBCOM DSNREXX"     /* Vuelve a validar ambientación */
end                                                       
else                                                      
  say 'DSNREXX: Ambientación disponible. RC='rc           
return rc                                                 
                                                          
                                                          
DB2_Connect:

parse value arg(1) with SSID .                            

say 'Conectando a SSID' SSID'...'                         
address DSNREXX 'CONNECT' SSID                  
if rc <> 0 then                                 
  say 'RC='rc '; Falla en conexión a' SSID'.'   
else                                            
  say 'RC='rc '; SSID' SSID 'disponible.'       
                                                
say '   SQLCODE:' sqlcode '; SQLSTATE:' sqlstate
                                                
return sqlcode                                  
Para mayor referencia con lo que buscas te sugiero revisar el libro de programación de DB2 para z-OS. Te anexo el link de donde obtuve la base para validar el proceso y crear la ambientación con DB2.

https://www.ibm.com/support/knowledgece ... rface.html

Mucha suerte con ello. Si logras realizar la actividad sería bueno nos apoyaras colocando qué fue lo que hiciste para ello.

El camino de 1,000 kms inicia con un solo paso. :arriba:

Avatar de Usuario
Horacio Villa
Colaborador
Colaborador
Mensajes: 185
Registrado: 04 Dic 2003, 13:11
País: Argentina
Ciudad: Buenos Aires
Ocupación: DBA

Re: Select con REXX

Mensaje por Horacio Villa » 09 Abr 2018, 17:54

Si te niegan el acceso desde REXX, podés generar un secuencial con Unload y leerlo desde el REXX.
HV

Cerbumota
Colaborador
Colaborador
Mensajes: 134
Registrado: 07 Feb 2007, 05:34
País: España
Ciudad: Madrid
Ocupación: Otra

Re: Select con REXX

Mensaje por Cerbumota » 30 Abr 2018, 07:21

qwe2 escribió:
27 Feb 2018, 15:35
Hable con la mis DBA's y me dijeron basicamente que ahora no hay posibilidad de conectarse desde REXX a DB2,...............
No me queda claro si no hay posibilidad porque no tienes activo el subsistema en concreto (cuestión para SO, no para DB2), porque DB2 tiene capado el acceso (lo dudo porque no sé hasta que punto DB2 recibe una SELECT y diferencia si es desde un Cobol, desde un REXX, o un PL/I...), o porque creen que desde REXX no se puede (que sí se puede y además, salva un apuro en muchas ocasiones, a un coste de máquina módico)... ¿Cuál es?
Mi lema favorito, el de las tres "uVes": Velocidad, Valor y... Vuevos.

Avatar de Usuario
jlanderos
Usuario
Usuario
Mensajes: 18
Registrado: 26 Sep 2017, 18:21
País: México
Ciudad: CDMX
Ocupación: IT Specialist

Re: Select con REXX

Mensaje por jlanderos » 19 May 2018, 10:49

Hola Cerbumota.

Respondiendo desde mi experiencia te diré que si es posible. De hecho el ejemplo que coloqué recientemente fue trabajando bajo un Sistema Operativo z/OS 2.1, conectándome a un DB2 for z/OS 11.

El ejemplo valida la existencia de un SSID dentro del ambiente de laboratorio. En caso de que no exista activo o simplemente el DB2 no esté disponible falla.

Después del ejemplo que coloqué hice pruebas de SELECT para consultar tablas del catalogo de DB2 y no tuve mayor problema.

Solo me costó un poco porque aún no entiendo muy bien la estructura de DB2 para poder crear una consulta.

El camino de 1,000 kms inicia con un solo paso. :arriba:

Cerbumota
Colaborador
Colaborador
Mensajes: 134
Registrado: 07 Feb 2007, 05:34
País: España
Ciudad: Madrid
Ocupación: Otra

Re: Select con REXX

Mensaje por Cerbumota » 19 May 2018, 13:16

Lo sé jlanderos. Lo indicaba en mi respuesta... :arriba: Pero me quedaba la duda, ante la afirmación de qwe2 sobre que no se podía en su instalación. No tengo ni idea si es posible "capar" Rexx para que no pueda acceder a DB2, o "tapar" DB2 para que no admita conexiones de Rexx. Y quería aprender. Pero ya sé que se puede acceder. Para cualquier accion: select, update, delete, insert...

Ya que te veo puesto en el tema, una pregunta. (Aunque quizás debería comenzar un hilo con ello.) Para hacer una select que devuelva una sola fila de la tabla, se extraen las variables de salida con FETCH. ¿Cómo saco la información de una select con más de un registro de salida?

Un saludo.
Mi lema favorito, el de las tres "uVes": Velocidad, Valor y... Vuevos.

Avatar de Usuario
Horacio Villa
Colaborador
Colaborador
Mensajes: 185
Registrado: 04 Dic 2003, 13:11
País: Argentina
Ciudad: Buenos Aires
Ocupación: DBA

Re: Select con REXX

Mensaje por Horacio Villa » 19 May 2018, 14:51

Para poder acceder a DB2 desde REXX se debe tener permiso de EXECUTE de alguno de los packages DSNREXX en las COLLECTIONs DSNREXRR, DSNREXXCS o DSNREXXUR.
Eso se puede manejar dentro del REXX así:
ADDRESS TSO "SUBCOM DSNREXX"
IF RC THEN S_RC = RXSUBCOM('ADD','DSNREXX','DSNREXX')
ADDRESS DSNREXX "CONNECT" ssid
IF SQLCODE \= 0 THEN CALL SQL_Error
ADDRESS DSNREXX "EXECSQL SET CURRENT PACKAGESET='DSNREXUR'" /* o DSNREXRR o DSNREXCS */
IF SQLCODE \= 0 THEN CALL SQL_Error /* manejar el error */

Por ejemplo, se puede hacer esto:
SQL_Error:
SAY '*SYSID =' ssid
SAY '*SQLCODE=' SQLCODE
SAY 'SQLERRMC=' SQLERRMC
SAY "LAST RC..:" RC
SAY "INVOKING.:" SIGL
EXIT 12

El SELECT con REXX siempre es via un cursor, haya 1 sola fila o muchas.
La secuencia, tomada de Application Programming and SQL Guide Chap. 9 es así:
SQLSTMT = "SELECT PHONENO FROM DSN8B10.EMP WHERE LASTNAME = ?’"
lastname = 'HAAS'
"EXECSQL DECLARE C1 CURSOR FOR S1"
"EXECSQL PREPARE S1 FROM :SQLSTMT"
"EXECSQL OPEN C1 USING :lastname"
(chequear SQLCODE)

"EXECSQL FETCH C1 INTO :HVPhone :INDPhone"
(chequear SQLCODE)
If INDPhone < 0 Then ,
Say ’Phone number for Haas is null.’

(Se repite ciclo de FETCH hasta SQLCODE = 100 o error)

"EXECSQL CLOSE C1"

Leer Cursors and Statements names in REXX en el Application Programming.
HV

Cerbumota
Colaborador
Colaborador
Mensajes: 134
Registrado: 07 Feb 2007, 05:34
País: España
Ciudad: Madrid
Ocupación: Otra

Re: Select con REXX

Mensaje por Cerbumota » 19 May 2018, 15:42

Gracias Horacio.
La verdad es que he sido un poco vago con minpregunta... :silbo: Ya había pensado hacer un bucle hasta conseguir el 100, pero no lo había probado. :lengua:
No obstante, revisaré la documentación que indicas. Aunque ya he consultado lo que indicas, nunca es tarde para refrescarlo.
Muchas gracias :arriba:
Mi lema favorito, el de las tres "uVes": Velocidad, Valor y... Vuevos.

Avatar de Usuario
jlanderos
Usuario
Usuario
Mensajes: 18
Registrado: 26 Sep 2017, 18:21
País: México
Ciudad: CDMX
Ocupación: IT Specialist

Re: Select con REXX

Mensaje por jlanderos » 19 May 2018, 21:34

Hola Cerbumota:

Es correcto lo que comenta el amigo Horacio Villa.

Solamente te sugeriría que sí solo quieres extraer los primeros, o últimos, "x" registros agregues a la sentencia la instrucción "FIRST" o "LAST" X ROWS. Por ejemplo, para extraer los primeros 100 registros de una tabla usas la siguiente sentencia y luego la extraes como comenta Horacio Villa.

SELECT PHONENO FROM DSN8B10.EMP WHERE LASTNAME = ? FETCH FIRST 100 ROWS ONLY

Al final tú ambiente te lo agradecerá... ya sabes, con eso de que los mips cada vez valen más :D

El camino de 1,000 kms iniciar con un solo paso. :arriba:

Cerbumota
Colaborador
Colaborador
Mensajes: 134
Registrado: 07 Feb 2007, 05:34
País: España
Ciudad: Madrid
Ocupación: Otra

Re: Select con REXX

Mensaje por Cerbumota » 19 May 2018, 22:23

Jajajaja. Claro. Es un parámetro de SQL de toda la vida... o casi. :dance:
Respecto a los mips, también es cierto. Pero cuando hay que hacer algo, hay que hacerlo. Sin embargo, para select extensas, creo que usaría un directamente una ejecución batch con salida a fichero. Como dices, hay que usar tanto los mips, como la cabeza. :reverencia: Aunque lo segundo duela... :silbo: :silbo: :silbo:
Mi lema favorito, el de las tres "uVes": Velocidad, Valor y... Vuevos.

Responder