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
COBOL Código:
MOVE POW-NUMERIC OF CAMPO1 TO WB1.
MOVE POW-NUMERIC OF CAMPO2 TO WB2.
EXEC SQL
DECLARE cursor_CON CURSOR FOR
SELECT * FROM CLIENTES
WHERE CLICOD BETWEEN :WB1 AND :WB2
ORDER BY CLINOM ASC
END-EXEC.
EXEC SQL
OPEN cursor_CON
END-EXEC.
PERFORM CARGAR THRU FIN-CARGAR UNTIL SQLSTATUS = "02000".
EXEC SQL
CLOSE cursor_CON
END-EXEC.
EXIT PROGRAM.
CARGAR.
EXEC SQL
FETCH cursor_CON
INTO :CLICOD,
:CLINOM,
.
.
.
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.
COBOL Código:
MOVE POW-NUMERIC OF CAMPO1 TO WB1.
STRING "SELECT * FROM CLIENTES WHERE CLICOD = "
WB1
" LIMIT 1 INTO :CLICOD, :CLINOM , etc ..." DELIMITED BY SIZE INTO SQLCON
END-STRING.
EXEC SQL
PREPARE consulta FROM :SQLCON
END-EXEC.
EXEC SQL
EXECUTE consulta
END-EXEC
EXEC SQL
COMMIT
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
Marcadores