发出SQL语句的汇编程序应用程序

只要可以使用可执行语句,您就可以在汇编程序中编写SQL语句。

汇编程序中的每个 SQL 语句必须以 EXEC SQL 开头。 EXEC和SQL关键字必须出现在同一行,但语句的其余部分可以出现在后续行中。

您可以在汇编程序中编写如下UPDATE语句:
   EXEC SQL UPDATE DSN8C10.DEPT                            X
               SET MGRNO = :MGRNUM                         X
               WHERE DEPTNO = :INTDEPT
注释
您不能在SQL语句中包含汇编程序注释。 但是,您可以在任何嵌入的 SQL 语句中包含 SQL 注释。 更多信息,请参阅 SQL注释
SQL语句的延续
SQL语句的行延续规则与汇编语句的规则相同,只是必须在同一行中指定EXEC SQL。 如果语句中的任何部分无法在一行中显示,则可以从续行边距(第16列,默认值)开始,显示在后续行中。 除最后一句外,每句话的每一行都必须紧接在72列右边缘之后有一个延续字符(非空字符)。
SQL语句的分隔符
在汇编程序中,使用关键字 EXEC SQL 和行尾或上一行的行尾来限定SQL语句。
声明表和视图
您的汇编程序应包含一个DECLARE语句,用于描述每个表并查看程序访问。
包括代码
若要包含来自分区数据集成员的 SQL 语句或汇编主机变量声明语句,请将以下 SQL 语句放置在要包含语句的源代码中:
   EXEC SQL INCLUDE member-name

您不能嵌套SQL INCLUDE语句。

页边距
使用预编译选项MARGINS设置左页边距、右页边距和续页边距。 这些边距的默认值分别为第1、71和16列。 如果EXEC SQL在指定的左边界之前开始,则 Db2 预编译器无法识别SQL语句。 如果您使用默认边距,则可以在第2列和第71列之间的任何位置放置SQL语句。
多行FETCH语句
您只能使用FETCH... 在汇编程序中使用多行FETCH语句的描述符形式。 Db2 预编译器无法识别汇编程序的主变量数组声明。
名称

您可以使用任何有效的汇编程序名称作为主机变量。 但是,不要使用以“DSN”开头的外部输入名称或访问计划名称,也不要使用以“SQL”开头的宿主变量名称。 这些名字是 Db2 的专用名称。

在嵌入式SQL中使用的宿主变量的第一个字符不能是下划线。 但是,在嵌入式 SQL 中不使用的符号中,您可以使用下划线作为第一个字符。

声明标签
您可以在SQL语句前添加一个标签。 SQL语句的第一行可以使用从左边距(第1列)开始的标签。 如果您不使用标签,请留空第1栏。
WHENEVER 语句
SQL语句中WHENEVER子句的GOTO子句的目标必须是汇编源代码中的标签,且必须在WHENEVER影响的SQL语句的作用域内。
装配工注意事项
以下注意事项适用于汇编语言编写的程序:
  • 为了实现可重入程序,预编译器将其生成的所有变量和结构都放在一个名为SQLDSECT的DSECT中,并生成一个名为SQLDLEN的汇编符号。 SQLDLEN包含DSECT的长度。 您的程序必须分配一个SQLDLEN指定的区域,对其进行初始化,并为其提供可寻址性,即DSECT SQLDSECT。 预编译器不会为SQLDSECT分配存储空间,应用程序必须自行分配存储空间。
    CICS® :下面是一个支持可重入程序的代码示例,运行于 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
    *
    在这个例子中,实际的存储分配由DFHEIENT宏完成。
    TSO: 前缀为.SDSNSAMP(DSNTIAD) 示例程序包含如何在TSO环境中运行的程序中为SQLDSECT获取存储空间的示例。 以下示例代码包含前缀.SDSNSAMP (DSNTIAD)的片段,并在注释中附有解释。
    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 不处理SQL语句中的固定符号。
  • 生成的代码中每个注释可以包含两个以上的延续。
  • 生成的代码使用文字常量(例如,=F'-84'),因此可能需要LTORG语句。
  • 生成的代码使用寄存器0、1、14和15。 将13个点记录到被调用程序使用的保存区域。 在SQL语句生成的调用后,注册15不包含返回代码。
    CICS :一个 CICS 应用程序使用DFHEIENT宏来生成入口代码。 使用此宏时,请注意以下几点:
    • 如果您在DFHEIENT宏中使用默认的DATAREG,请将13个点记录到保存区域。
    • 如果您在DFHEIENT宏中使用任何其他DATAREG,则必须提供可寻址的保存区域。
      例如,要使用SAVED,您可以像以下示例中那样,在每个SQL语句周围编写代码,以保存、加载和恢复寄存器13。
      ST    13,SAVER13       SAVE REGISTER 13
      LA    13,SAVED         POINT TO SAVE AREA
      EXEC  SQL . . .
      L     13,SAVER13       RESTORE REGISTER 13
  • 如果由于 SQL 语句中的输入或输出主机变量而导致预编译器生成的代码出现寻址错误,请检查并确保您有足够的基本寄存器。
  • 请勿在程序源代码中添加 CICS 翻译选项。 请使用参数字段将选项传递给翻译人员。
处理 SQL 错误代码
汇编程序应用程序可以从 Db2 获取有关 SQL 错误的更多信息。 更多信息,请参阅汇编程序应用程序中的SQL错误代码处理