PL/I 发布 SQL 语句的应用程序
只要能使用可执行语句,就能在 PL/I 程序中编写 SQL 语句。
PL/I 程序的第一条语句必须是带有 OPTIONS(MAIN) 的 PROCEDURE 语句,除非程序是存储过程。 存储过程应用程序可以作为子程序运行。
PL/I 程序中的每条 SQL 语句必须以 EXEC SQL 开始,以分号(;)结束。EXEC 和 SQL 关键字必须出现在一行中,但语句的其余部分可以出现在随后的行中。
在 PL/I 程序中,UPDATE 语句的代码可能如下:
EXEC SQL UPDATE DSN8C10.DEPT
SET MGRNO = :MGR_NUM
WHERE DEPTNO = :INT_DEPT ; - 注释
- 在嵌入式 SQL 语句中,除了关键字 EXEC 和 SQL 之间,凡是可以使用空格的地方,都可以包含 PL/I 注释。 您还可以在任何SQL语句中添加SQL注释。 更多信息,请参阅 SQL注释。
要在评论中包含DBCS字符,必须使用换出和换入控制字符来分隔字符;DBCS字符串中的第一个换入字符表示DBCS字符串的结束。
- SQL语句的继续
- SQL 语句的续行规则与其他 PL/I 语句相同,但必须在一行中指定
EXEC SQL。 - SQL语句的分隔符
- 在 PL/I 程序中,用开头关键字
EXEC SQL和分号 (;) 限定 SQL 语句。 - 声明表和视图
- PL/I 程序应包含 DECLARE TABLE 语句,以描述程序访问的每个表和视图。 您可以使用 Db2 声明生成器(DCLGEN)生成DECLARE TABLE语句。
- 包括代码
- 在要包含语句的源代码中使用以下 SQL 语句,就可以使用分区数据集中的 SQL 语句或 PL/I 主机变量声明:
EXEC SQL INCLUDE member-name;您不能嵌套SQL INCLUDE语句。 请勿使用 PL/I %INCLUDE 语句包含 SQL 语句或主机变量 DCL 语句。 在使用 Db2 预编译器之前,必须使用 PL/I 预编译器来解决任何 %INCLUDE 语句。 请勿在 SQL 语句中使用 PL/I 预处理器指令。
- 页边距
- 在2-72列中编写SQL代码,除非您已向 Db2 预编译器指定了其他边距。 如果EXEC SQL在指定的左边界之前开始,则 Db2 预编译器无法识别SQL语句。
- 名称
- 您可以为主机变量使用任何有效的 PL/I 名称。 不要使用以“DSN”开头的外部输入名称或访问计划名称,也不要使用以“SQL”开头的宿主变量名称。 这些名字是 Db2 的保留名称。
- 序号
- Db2 预编译器生成的源语句不包含序列号。 IEL0378I PL/I 编译器发出的信息来识别没有序列号的代码行。 您可以忽略这些消息。
- 声明标签
- 您可以为可执行的 SQL 语句指定语句标签。 但是,INCLUDE 文本文件名和END DECLARE SECTION语句不能有语句标签。
- WHENEVER 语句
- SQL 语句 WHENEVER 中 GOTO 子句的目标必须是 PL/I 源代码中的标签,并且必须在 WHENEVER 影响的任何 SQL 语句的范围内。
- 使用双字节字符集(DBCS)字符
- 在带有 SQL 语句的 PL/I 程序中使用 DBCS 时应注意以下事项:
- 如果在 PL/I 源中使用 DBCS,则 Db2 规则适用于以下语言元素:
- 图形字符串
- 图形字符串常量
- 主机标识符
- 字符串中的混合数据
- 混合数据选项
- PL/I 预处理器转换了 DBCS 常量的格式。 如果您不想进行这种转换,请运行 Db2 预编译器位于预处理器之前。
- 如果在动态编写的 SQL 语句中使用图形字符串常量或混合数据,并且如果应用程序需要 PL/I Version 2(或更高版本)编译器,则动态编写的语句必须使用 PL/I 混合常量格式。
- 如果通过主机变量编写语句,则将字符串赋值改为 PL/I 混合字符串。
- 如果使用 PL/I 字符串编写语句,请将其更改为主机变量,然后将字符串赋值更改为 PL/I 混合字符串。
示例:
SQLSTMT = 'SELECT <dbdb> FROM table-name'M; EXEC SQL PREPARE STMT FROM :SQLSTMT; - 如果希望 DBCS 标识符类似于 PL/I 图形字符串,则必须使用分隔标识符。
- 如果您在评论中包含DBCS字符,则必须使用换出和换入控制字符来分隔字符。 第一个换行字符表示DBCS字符串的结束。
- 您可以在 PL/I 应用程序中声明使用 DBCS 字符的主机变量名。 在 PL/I 中使用 DBCS 变量名的规则遵循 DBCS SQL 普通标识符的现有规则,但长度除外。 在 Db2 中,一个主变量的最大长度为128个Unicode字节。 有关DBCS SQL普通标识符的规则,请参阅SQL标识符的信息。限制:
- DBCS变量名只能包含DBCS字符。 在DBCS变量名称中混合使用单字节字符集(SBCS)字符和双字节字符集(DBCS)字符会产生不可预测的结果。
- DBCS变量名不能延续到下一行。
- PL/I 预处理器将非汉字 DBCS 字符转换为扩展二进制编码十进制交换码 (EBCDIC) SBCS 字符。 为避免这一变化,请在 DBCS 变量名中使用汉字 DBCS 字符,或在不使用 PL/I 预处理器的情况下运行 PL/I 编译器。
- 如果在 PL/I 源中使用 DBCS,则 Db2 规则适用于以下语言元素:
- PL/I 特别注意事项
- 以下注意事项适用于用 PL/I 编写的程序:
- 编译包含 SQL 语句的 PL/I 程序时,必须使用 PL/I 编译器选项 CHARSET (60 EBCDIC)。
- 在编译使用 BIGINT 或 LOB 数据类型的 PL/I 程序时,请指定以下编译器选项:limits(fixedbin(63), fixeddec(31))
- 在特殊情况下, PL/I 中生成的注释可以包含分号。 分号会生成编译器信息 IEL0239I ,可以忽略。
- PL/I 声明中的生成代码可以包含定义为字符变化字段的 ADDR 函数。 这将产生 IBM105l l 或 IBM1180l W 消息,您可以忽略这两条消息。
- PL/I 源程序中预编译器生成的代码可以包含 NULL() 函数。 这将产生 IEL0533I 消息,您可以忽略它,除非您也使用 NULL 作为 PL/I 变量。 如果在 Db2 应用程序中将 NULL 用作 PL/I 变量,还必须将 NULL 声明为内置函数 (DCL NULL BUILTIN;) 以避免 PL/I 编译器错误。
- 如果在运行 Db2 预编译器之前运行宏处理器, PL/I 宏处理器可以生成 SQL 语句或主机变量 DCL 语句。
如果使用 PL/I 宏处理器,请勿在源代码中使用 PL/I *PROCESS 语句向 PL/I 编译器传递选项。 您可以在 DSNH 命令的 COPTION 参数或 DSNHPLI 程序中 EXEC 语句的 PARM.PLI=options 选项中指定所需的选项。
- 使用 PL/I 多任务设施(其中多个任务执行 SQL 语句)会导致不可预测的结果。
- PL/I WIDECHAR 主机数据类型仅通过 Db2 协处理器支持。
- 使用 PL/I WX widechar 常量时, Db2 只支持 bigendian 格式。 因此,在 PL/I 中为 widechar 类型主机变量分配常量时,请确保使用 bigendian 格式。 例如:
相当于:HVWC1 = '003100320033006100620063'WX;
HVWC1 被定义为WIDECHAR类型的主变量。HVWC1 = '123abc'; - PL/I SQL 预处理器选项 CCSID0 和 NOCCSID0 ,与 Db2 协处理器一起使用时要考虑使用情况。
- 使用 CCSID0 (默认值)时,可与使用 Db2 预编译器的旧版 PL/I 程序兼容。 在程序准备期间,除了WIDECHAR类型的主变量外,任何CCSID值都不会与主变量相关联。 对于 WIDECHAR 类型的主机变量,CCSID 1200 始终由 PL/I SQL 预处理器分配。
在绑定和运行时期间,如果主机变量没有关联任何 CCSID,则使用绑定选项 ENCODING,该选项用于应用程序数据。 如果未指定编码绑定选项,则使用编码绑定选项的默认值。
- 当您使用 NOCCSID0 时,在程序准备期间,CCSID与宿主变量相关联。 在项目准备期间,CCSID由以下项目组成:
- 声明:已指定变量CCSID xxxx。
- 源代码:CCSID,如果没有DECLARE VARIABLE... 主机变量指定为CCSID xxxx。 在绑定期间,请注意,在程序准备期间分配给宿主变量的 CCSID 并不为绑定进程所知。 有关 BIND 时间 CCSID 解析的更多信息,请参阅字符串的编码方案和 CCSID 规则。
对于静态SQL中使用的宿主变量,确保通过DECLARE VARIABLE...分配/派生精确且匹配的CCSID。 CCSID xxxx ,源代码 CCSID 或 ENCODING BIND 选项或安装默认值
对于动态 SQL 中使用的参数标记,确保通过 DECLARE VARIABLE... 分配/派生相应的主变量,从而确保其 CCSID 准确无误。 CCSID xxxx、编码绑定选项或安装默认值。 源CCSID对参数标记没有影响。
- 使用 CCSID0 (默认值)时,可与使用 Db2 预编译器的旧版 PL/I 程序兼容。 在程序准备期间,除了WIDECHAR类型的主变量外,任何CCSID值都不会与主变量相关联。 对于 WIDECHAR 类型的主机变量,CCSID 1200 始终由 PL/I SQL 预处理器分配。
- 处理 SQL 错误代码
- PLI/I应用程序可以从 Db2 获取有关SQL错误的更多信息。 有关详细信息,请参阅 PL/I 应用程序中的 SQL 错误代码处理。