Ver Mensaje Individual
  #10
Antiguo 4 de mayo de 2021, 17:26
David
Forero Junior
Última Actividad 25.02.2022 13:37
Posts Posts: 12
Likes enviados Enviados: 16
Likes recibidos Recibidos: 3

Hola Josber

He leído con interés este post que has publicado

Citación del post de Josber Ver Mensaje
Cuando declaras un CURSOR, es como hacer un START en un fichero COBOL y la sentencia FETCH es como un READ fichero NEXT RECORD ..., es decir una lectura secuencial, cargas en memoria en una tabla virtual toda la consulta

Código COBOL:
  1.       MOVE POW-NUMERIC OF CAMPO1 TO WB1.
  2.       MOVE POW-NUMERIC OF CAMPO2 TO WB2.
  3.       EXEC SQL
  4.               DECLARE cursor_CON CURSOR FOR
  5.                            SELECT * FROM CLIENTES
  6.                            WHERE CLICOD BETWEEN :WB1 AND :WB2
  7.                            ORDER BY CLINOM ASC
  8.       END-EXEC.
  9.  
  10.        EXEC SQL
  11.                OPEN cursor_CON
  12.        END-EXEC.
  13.  
  14.        PERFORM CARGAR THRU FIN-CARGAR UNTIL SQLSTATUS = "02000".
  15.  
  16.        EXEC SQL
  17.                CLOSE cursor_CON
  18.        END-EXEC.
  19.  
  20.        EXIT PROGRAM.
  21.  
  22. CARGAR.
  23.        EXEC SQL
  24.                FETCH cursor_CON
  25.                          INTO :CLICOD,
  26.                                  :CLINOM,
  27.                                        .
  28.                                        .
  29.                                        .
  30.        END-EXEC.

Cuado usas la sentencia PREPARE, es como una lectura normal de un registro en COBOL, (READ fichero KEY IS ... INVALID KEY ...), si la consulta no varía, te vale con un simple SELECT, pero si varía, tienes que montar la instrucción de busqueda con un STRING, y utilizar un PREPARE, poque no hay otra manera de hacerlo, no puedes hacer un SELCT + el STRING de búsqueda, que es lo que yo necesito.

Código COBOL:
  1.       MOVE POW-NUMERIC OF CAMPO1 TO WB1.
  2.       STRING "SELECT * FROM CLIENTES WHERE CLICOD = "
  3.                  WB1
  4.                 " LIMIT 1 INTO :CLICOD, :CLINOM , etc ..." DELIMITED BY SIZE INTO SQLCON
  5.       END-STRING.
  6.  
  7.       EXEC SQL
  8.               PREPARE consulta FROM :SQLCON
  9.       END-EXEC.
  10.  
  11.       EXEC SQL
  12.                EXECUTE consulta
  13.       END-EXEC
  14.  
  15.       EXEC SQL
  16.               COMMIT
  17.       END-EXEC.

Pero me da la sensación que la sentencia PREPARE y EXECUTE, el compilador no las acepta y es una ****da, porque se utilizan bastante en SQL.

Un saludo

El cual aporta el trato de un tema muy interesante.
En mi caso he pensado en utilizar el PREPARE para construir el CURSOR, sigo investigando, pero me preguntaba si después de varios años, uds. han logrado algo más del información


Saludos
David is offline   Responder Con Cita