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.

Podría codificar una instrucción UPDATE en un programa ensamblador de la siguiente manera:
   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-name

No 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 :
    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
    *
    En este ejemplo, la asignación de almacenamiento real la realiza la macro DFHEIENT.
    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.
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.