发出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 下:
在这个例子中,实际的存储分配由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: 前缀为.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 翻译选项。 请使用参数字段将选项传递给翻译人员。
- 为了实现可重入程序,预编译器将其生成的所有变量和结构都放在一个名为SQLDSECT的DSECT中,并生成一个名为SQLDLEN的汇编符号。 SQLDLEN包含DSECT的长度。 您的程序必须分配一个SQLDLEN指定的区域,对其进行初始化,并为其提供可寻址性,即DSECT SQLDSECT。 预编译器不会为SQLDSECT分配存储空间,应用程序必须自行分配存储空间。
- 处理 SQL 错误代码
- 汇编程序应用程序可以从 Db2 获取有关 SQL 错误的更多信息。 更多信息,请参阅汇编程序应用程序中的SQL错误代码处理。