Aplicaciones ensambladoras que emiten sentencias SQL
Puede codificar sentencias SQL en programas ensambladores siempre que pueda utilizar sentencias ejecutables.
Cada instrucción SQL en un programa ensamblador debe comenzar con EXEC SQL. Las palabras clave EXEC y SQL deben aparecer en una línea, pero el resto de la instrucción puede aparecer en líneas posteriores.
EXEC SQL UPDATE DSN8C10.DEPT X
SET MGRNO = :MGRNUM X
WHERE DEPTNO = :INTDEPT- Comentarios
- No puede incluir comentarios de ensamblador en las sentencias SQL. Sin embargo, puede incluir comentarios SQL en cualquier instrucción SQL incrustada. Para más información, consulte los comentarios de SQL.
- Continuación para sentencias SQL
- Las reglas de continuación de línea para las sentencias SQL son las mismas que para las sentencias ensambladoras, excepto que debe especificar EXEC SQL dentro de una línea. Cualquier parte de la declaración que no quepa en una línea puede aparecer en las líneas siguientes, comenzando en el margen de continuación (columna 16, por defecto). Cada línea del estado de cuenta, excepto la última, debe tener un carácter de continuación (un carácter que no esté en blanco) inmediatamente después del margen derecho en la columna 72.
- Delimitadores para instrucciones SQL
- Delimite una instrucción SQL en su programa ensamblador con la palabra clave de inicio "
EXEC SQL" y un final de línea o final de la última línea continuada. - Declaración de tablas y vistas
- Su programa ensamblador debe incluir una instrucción DECLARE para describir cada tabla y ver los accesos del programa.
- Incluir código
- Para incluir sentencias SQL o sentencias de declaración de variables de host ensamblador de un miembro de un conjunto de datos particionado, coloque la siguiente sentencia SQL en el código fuente donde desee incluir las sentencias:
EXEC SQL INCLUDE member-nameNo se pueden anidar sentencias SQL INCLUDE.
- Márgenes
- Utilice la opción del precompilador MARGINS para establecer un margen izquierdo, un margen derecho y un margen de continuación. Los valores predeterminados para estos márgenes son las columnas 1, 71 y 16, respectivamente. Si EXEC SQL comienza antes del margen izquierdo especificado, el precompilador de instrucciones SQL ( Db2 ) no reconoce la instrucción SQL. Si utiliza los márgenes predeterminados, puede colocar una instrucción SQL en cualquier lugar entre las columnas 2 y 71.
- Sentencia FETCH de varias filas
- Solo puede utilizar el FETCH... USO DEL DESCRIPTOR forma de la sentencia FETCH de varias filas en un programa ensamblador. El precompilador de ensamblador ( Db2 ) no reconoce las declaraciones de matrices de variables de host para un programa ensamblador.
- Nombres
Puede utilizar cualquier nombre de ensamblador válido para una variable de host. Sin embargo, no utilice nombres de entrada externos o nombres de planes de acceso que empiecen por «DSN» ni nombres de variables de host que empiecen por «SQL». Estos nombres están reservados para Db2.
El primer carácter de una variable de host que se utiliza en SQL incrustado no puede ser un guión bajo. Sin embargo, puede utilizar un guión bajo como primer carácter de un símbolo que no se utilice en SQL incrustado.
- Etiquetas de declaración
- Puede anteponer una etiqueta a una instrucción SQL. La primera línea de una instrucción SQL puede utilizar una etiqueta que comience en el margen izquierdo (columna 1). Si no utiliza una etiqueta, deje la columna 1 en blanco.
- WHENEVER, sentencia
- El objetivo de la cláusula GOTO en una instrucción SQL WHENEVER debe ser una etiqueta en el código fuente del ensamblador y debe estar dentro del ámbito de las instrucciones SQL a las que WHENEVER afecta.
- Consideraciones especiales para el montador
- Las siguientes consideraciones se aplican a los programas escritos en ensamblador:
- Para permitir programas reentrantes, el precompilador coloca todas las variables y estructuras que genera dentro de un DSECT llamado SQLDSECT, y genera un símbolo ensamblador llamado SQLDLEN. SQLDLEN contiene la longitud del DSECT. Su programa debe asignar un área del tamaño indicado por SQLDLEN, inicializarla y proporcionarle direccionabilidad como DSECT SQLDSECT. El precompilador no genera código para asignar el almacenamiento para SQLDSECT; el programa de aplicación debe asignar el almacenamiento.CICS® : A continuación se muestra un ejemplo de código para admitir programas reentrantes, que se ejecutan bajo CICS :
En este ejemplo, la asignación de almacenamiento real la realiza la macro DFHEIENT.DFHEISTG DSECT DFHEISTG EXEC SQL INCLUDE SQLCA * DS 0F SQDWSREG EQU R7 SQDWSTOR DS (SQLDLEN)C RESERVE STORAGE TO BE USED FOR SQLDSECT ⋮ XXPROGRM DFHEIENT CODEREG=R12,EIBREG=R11,DATAREG=R13 * * * SQL WORKING STORAGE LA SQDWSREG,SQDWSTOR GET ADDRESS OF SQLDSECT USING SQLDSECT,SQDWSREG AND TELL ASSEMBLER ABOUT IT *TSO: El programa de muestra con prefijo. SDSNSAMP (DSNTIAD) contiene un ejemplo de cómo adquirir almacenamiento para SQLDSECT en un programa que se ejecuta en un entorno TSO. El siguiente código de ejemplo contiene fragmentos del prefijo .SDSNSAMP (DSNTIAD) con explicaciones en los comentarios.DSNTIAD CSECT CONTROL SECTION NAME SAVE (14,12) ANY SAVE SEQUENCE LR R12,R15 CODE ADDRESSABILITY USING DSNTIAD,R12 TELL THE ASSEMBLER LR R7,R1 SAVE THE PARM POINTER * * Allocate storage of size PRGSIZ1+SQLDSIZ, where: * - PRGSIZ1 is the size of the DSNTIAD program area * - SQLDSIZ is the size of the SQLDSECT, and declared * when the DB2 precompiler includes the SQLDSECT * L R6,PRGSIZ1 GET SPACE FOR USER PROGRAM A R6,SQLDSIZ GET SPACE FOR SQLDSECT GETMAIN R,LV=(6) GET STORAGE FOR PROGRAM VARIABLES LR R10,R1 POINT TO IT * * Initialize the storage * LR R2,R10 POINT TO THE FIELD LR R3,R6 GET ITS LENGTH SR R4,R4 CLEAR THE INPUT ADDRESS SR R5,R5 CLEAR THE INPUT LENGTH MVCL R2,R4 CLEAR OUT THE FIELD * * Map the storage for DSNTIAD program area * ST R13,FOUR(R10) CHAIN THE SAVEAREA PTRS ST R10,EIGHT(R13) CHAIN SAVEAREA FORWARD LR R13,R10 POINT TO THE SAVEAREA USING PRGAREA1,R13 SET ADDRESSABILITY * * Map the storage for the SQLDSECT * LR R9,R13 POINT TO THE PROGAREA A R9,PRGSIZ1 THEN PAST TO THE SQLDSECT USING SQLDSECT,R9 SET ADDRESSABILITY ... LTORG ********************************************************************** * * * DECLARE VARIABLES, WORK AREAS * * * ********************************************************************** PRGAREA1 DSECT WORKING STORAGE FOR THE PROGRAM ... DS 0D PRGSIZE1 EQU *-PRGAREA1 DYNAMIC WORKAREA SIZE ... DSNTIAD CSECT RETURN TO CSECT FOR CONSTANT PRGSIZ1 DC A(PRGSIZE1) SIZE OF PROGRAM WORKING STORAGE CA DSECT EXEC SQL INCLUDE SQLCA ... - Db2 no procesa símbolos establecidos en sentencias SQL.
- El código generado puede incluir más de dos continuaciones por comentario.
- El código generado utiliza constantes literales (por ejemplo, =F'-84'), por lo que podría ser necesaria una instrucción LTORG.
- El código generado utiliza los registros 0, 1, 14 y 15. Registrar 13 puntos en un área de guardado que utiliza el programa llamado. El registro 15 no contiene un código de retorno después de una llamada generada por una instrucción SQL.CICS : Un programa de aplicación de CICS ® utiliza la macro DFHEIENT para generar el código del punto de entrada. Al utilizar esta macro, tenga en cuenta lo siguiente:
- Si utiliza el DATAREG predeterminado en la macro DFHEIENT, registre 13 puntos en el área de guardado.
- Si utiliza cualquier otro DATAREG en la macro DFHEIENT, debe proporcionar direccionabilidad a un área segura.Por ejemplo, para utilizar SAVED, puede codificar instrucciones para guardar, cargar y restaurar el registro 13 alrededor de cada instrucción SQL como en el siguiente ejemplo.
ST 13,SAVER13 SAVE REGISTER 13 LA 13,SAVED POINT TO SAVE AREA EXEC SQL . . . L 13,SAVER13 RESTORE REGISTER 13
- Si tiene un error de direccionamiento en el código generado por el precompilador debido a variables de host de entrada o salida en una instrucción SQL, compruebe que tiene suficientes registros base.
- No ponga opciones de traducción automátic CICS es en el código fuente del ensamblado. En su lugar, pase las opciones al traductor utilizando el campo PARM.
- Para permitir programas reentrantes, el precompilador coloca todas las variables y estructuras que genera dentro de un DSECT llamado SQLDSECT, y genera un símbolo ensamblador llamado SQLDLEN. SQLDLEN contiene la longitud del DSECT. Su programa debe asignar un área del tamaño indicado por SQLDLEN, inicializarla y proporcionarle direccionabilidad como DSECT SQLDSECT. El precompilador no genera código para asignar el almacenamiento para SQLDSECT; el programa de aplicación debe asignar el almacenamiento.
- Manejo de códigos de error de SQL
- Las aplicaciones ensambladoras pueden solicitar más información sobre errores SQL en Db2. Para obtener más información, consulte Manejo de códigos de error SQL en aplicaciones ensambladoras.