静态 SQL 包

DRDA 服务支持动态和静态 SQL 语句执行。 通过将一组基本的 ANSI SQL 92 Entry-Level DB2 语法转换为 Microsoft SQL Server T-SQL 语法,DRDA 服务器将处理动态 SQL 语句,例如 EXCSQLIMM (执行即时 SQL 语句) 和 EXCSQLSTT (执行 SQL 语句) 。 DRDA 服务将分两个步骤处理静态 SQL 语句: (1) 绑定时间, (2) 运行时。

在绑定时,DRDA 服务将处理 BGNBND (开始将包绑定到 RDB) ,BNDSQLSTT (将 SQL 语句绑定到 RDB 包) 到SQL Server T-SQL 存储过程。 (可选)DRDA 服务可以处理 Microsoft 静态 SQL for DB2 XML 文件的绑定,也可以通过调用自定义可替换绑定侦听器 (处理绑定,例如自定义或第三方包绑定器,这些绑定器可以支持) 更广泛的 SQL 语法转换。 有关 Microsoft DRDA 客户端和 DRDA 服务支持的包 XML 格式的详细信息,请参阅标题为 DB2 的静态 SQL 的主题。

在运行时,DRDA 服务会将 PRPSQLSTT (Prepare SQL 语句) 、EXCSQLSTT (执行 SQL 语句) ,以及 OPNQRY (Open Query) 命令处理到 T-SQL CALL 语句中。 为了支持服务器游标操作,DRDA 服务会将 OPNQRY 处理到打开的游标命令中,CNTQRY (Continue Query) 处理到 fetch 命令中,CLSQRY (Close Query) 处理到关闭游标命令中。 DRDA 服务将处理提交、回滚和同步日志命令,作为对 DRDA DUW (分布式工作单元) 的支持的一部分。

包命名约定

DRDA 使用由多个部分组成的 PKGNAM(RDB 包名称)定义完全限定的静态 SQL 包。

  • RDBNAM(关系数据库名称)

  • RDBCOLID(RDB 集合标识符)

  • PKGID(RDB 包标识符)

RDBNAME.RDBCOLID.PKGID.PKGCNSTKN.PKGSN  

前面的示例显示了具有一致性令牌的完全限定包名称。

警告

如果多个包的 PKGNAM 的值相同,则按 VRSNAM(版本名称)或 PKGCNSTKN(包名称一致性令牌)对这些包进行区分。

  • PKGCNSTKN(RDB 包一致性令牌)

  • VRSNAM(版本名称)

将包转换为存储过程

DRDA 服务通过处理 DRDA BGNBND (Begin Bind) 和 BNDSQLSTT (Bind SQL 语句) 协议流和格式化数据值,将 DB2 包的静态 SQL 和嵌入式 SQL 语句转换为SQL Server存储过程。 (可选)DRDA 服务可以将绑定处理为 XML 文件,以便以后转换为存储过程或进行故障排除。 此外,DRDA 服务可以调用自定义绑定侦听器组件来处理 BGNBND 和 BNDSQLSTT 流。 有关处理包绑定流的详细信息,请参阅操作手册。 有关自定义绑定侦听器的信息,请参阅程序员指南和程序员参考。

处理 DRDA 绑定包和数据流

在上图中,DB2 for z/OS 嵌入式 SQL 在 DB2 预编译阶段转换为 DB2 包,然后在 DB2 绑定复制阶段转换为 DRDA BGNBND 和 BNDSQLSTT 流,然后在处理 DRDA 绑定包和语句流时转换为 DRDA 服务SQL Server存储过程。

静态 SQL 包语句

IBM DB2 for z/OS 产品和文档包括一组安装验证测试示例程序,包括适用于 z/OS 的 COBOL

EXEC SQL CONNECT TO :TEMPLOC END-EXEC  
EXEC SQL INSERT INTO VHDEPT   
VALUES (:DEPT-NUMB, :DEPT-NAME, :DEPT-MGR,   
:DEPT-ADMR, :DEPT-LOC)  
END-EXEC.  
  

前面的示例演示了带有嵌入式 SQL CONNECT 和 INSERT 语句的 IBM DB2 for z/OS 示例 COBOL 程序。

CONNECT TO :H  
INSERT INTO VHDEPT VALUES (:H, :H, :H, :H, :H )  
  

前面的示例演示了 DB2 预编译器提取并存储在静态 SQL for DB2 包中的 IBM DB2 for z/OS 示例 COBOL 程序嵌入式 SQL 语句,每个语句一个部分。

<Section Number="18" Alias="">  
  <Statement Number="18">INSERT INTO VHDEPT VALUES ( :H , :H , :H , :H , :H ) </Statement>  
  <Parameters>  
    <Parameter Name="DEPT-NUMB" Type="Char" Length="3" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
    <Parameter Name="DEPT-NAME" Type="Char" Length="36" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
    <Parameter Name="DEPT-MGR" Type="Char" Length="6" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
    <Parameter Name="DEPT-ADMR" Type="Char" Length="3" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
    <Parameter Name="DEPT-LOC" Type="Char" Length="16" Precision="0" Scale="0" CCSID="37" Nullable="False" />  
  </Parameters>  
</Section>  

前面的示例演示了 IBM DB2 for z/OS 示例 COBOL 程序静态 SQL for DB2 包语句,这些语句由 DRDA 服务转换为静态 SQL for DB2 XML 文件节。 DB2 for z/OS 不包括远程 DRDA 定义的包中的 CONNECT 语句。

/****** BNDOPT: <Options><BNDCHKEXS>BNDEXSOPT</BNDCHKEXS><BNDCRTCTL>BNDNERALW</BNDCRTCTL><BNDEXPOPT>EXPNON</BNDEXPOPT><DFTRDBCOL>CXE001</DFTRDBCOL><DGRIOPRL>1</DGRIOPRL><PKGATHOPT>PKGATHKP</PKGATHOPT><PKGISOLVL>ISOLVLCS</PKGISOLVL><PKGOWNID>CXE001</PKGOWNID><PKGRPLOPT>PKGRPLALW</PKGRPLOPT><QRYBLKCTL>FIXROWPRC</QRYBLKCTL><RDBRLSOPT>RDBRLSCMM</RDBRLSOPT><STTDATFMT>USADATFMT</STTDATFMT><STTDECDEL>DECDELPRD</STTDECDEL><STTSTRDEL>STRDELAP</STTSTRDEL><STTTIMFMT>USATIMFMT</STTTIMFMT></Options> ******/  
  
CREATE PROCEDURE [DSN8910].[DSN8HC3_18BBB2BA1492DAC8_19] @DEPT_NUMB Char(3), @DEPT_NAME Char(36), @DEPT_MGR Char(6), @DEPT_ADMR Char(3), @DEPT_LOC Char(16)  
AS  
begin  
      INSERT INTO VHDEPT VALUES ( @DEPT_NUMB , @DEPT_NAME , @DEPT_MGR , @DEPT_ADMR , @DEPT_LOC )   
      return @@ROWCOUNT  
end  
GO  
  

前面的示例演示了 IBM DB2 for z/OS 示例 COBOL 程序静态 SQL for DB2 包语句,这些语句由 DRDA 服务转换为SQL Server CREATE PROCEDURE 语句。

DRDA 服务包绑定选项

DRDA BGNBND (Begin Bind) 流包含一组包绑定选项,这些选项可能会影响运行时包的存储和执行。 DRDA 服务将有限数量的绑定选项映射到SQL Server构造。 DRDA 服务将静态 SQL for DB2 包 XML 文件中的绑定选项保留为存储过程中的注释,并选择性地保留为存储过程上的扩展属性。

绑定包创建控制

DRDA 服务支持 DRDA BGNBND BNDCRTCTL (绑定包创建控制) ,它指示 MsDrdaService 跳过绑定错误。 BNDCRTCTL 码位支持值的枚举。

  • BNDCHKONL (绑定检查仅)

  • BNDNERALW (绑定 不允许) 错误

  • 允许) BNDERRALW (绑定错误

  • BNDNERALW (绑定 不允许) 错误

    默认情况下,DRDA 服务默认为 BNDNERALW (绑定不允许) 错误。 DRDA 服务) 返回 BGNBNDRM (BGNBNDRM 回复消息,并返回一个错误,指示问题,当发生以下任一实例时。

  • DRDA 到 XML 的转换问题

  • XML 到 DDL 转换问题

  • 自定义绑定侦听器在回调接口上返回 DDL

  • DRDA 服务无法执行 DDL 语句

    若要指示 DRDA 服务忽略错误并继续处理包,DRDA AR 客户端应指定 BNDCRTCTL 选项 BNDERRALW (允许) 绑定错误。

    将 DB2 管理工具与 DB2 for z/OS 配合使用时,DB2 管理员可以指定选项 SQLERROR“C” (继续) 。 将 DB2 绑定复制工具与 DB2 for z/OS 配合使用时,DB2 程序员可以导航到 DB2 BIND PACKAGE 面板,指定 CHANGE CURRENT DEFAULTS=YES,然后设置 SQLERROR PROCESSING=C。

绑定包替换

DRDA 服务支持 DRDA BGNBND PKGRPLOPT (包替换选项) ,该选项指示 MsDrdaService 删除并重新创建包存储过程。 PKGRPLOPT 码位支持布尔值。

目前,我们在处理 BGNBND (Begin Bind) BNDSQLSTT (Bind SQL 语句) 时添加但不替换包。 此选项指示 DB2 for z/OS 删除并创建包的新副本。

  • PKGRPLALW (允许的包替换)

  • 不允许) (包替换

    默认情况下,DRDA 服务默认为 PKGRPLALW (允许包替换) 。 DRDA 服务在执行 CREATE PROCEDURE 语句之前执行 DROP PROCEDURE 语句。

绑定选项列表

下面是静态 SQL for DB2 包 XML 文件中定义的包绑定选项列表。 这些元素、类型和值的格式因 Host Integration Server 版本而异。 在 HIS 2010 (V8.5) 中,该技术支持这些绑定选项的版本 8.5 格式。 在 HIS 2013 (V9.0) 中,该技术支持这些绑定选项的 9.0 版本格式,该格式更详细且更具描述性。 HIS 2013 技术包括一个 XSD 架构文件,用于静态 SQL for DB2 包 XML 文件

DRDA 服务静态 SQL 游标

当处理 DRDA 开始绑定和绑定 SQL 语句命令(包括嵌入式 SQL DECLARE CURSOR 语句)时,DRDA 服务会将 DB2 包的静态 SQL 转换为SQL Server存储过程。 根据游标类型,DRDA 服务定义存储过程以包含其他输入参数 (“INVOKE_TYPE”) 定义游标 (操作,例如打开、提取、关闭) 。 DRDA 服务在SQL Server存储过程中包含注释,用于表示绑定选项 (例如固定行协议) 和游标类型 (例如全局,用于更新,只读) 。

声明并打开游标

DRDA 服务通过调用具有调用类型参数参数“@_INVOKE_TYPE\_ = 0”的SQL Server存储过程来打开游标, 响应 DRDA AR OPNQRY (Open Query) ,以支持使用者程序的 DECLARE CURSOR 和 OPEN CURSOR 命令,在对名为 QRYDTA (查询答案) 数据集的 DRDA OPNQRY 命令的回复中向 DRDA AR 返回单个行。

针对游标提取

DRDA 服务通过调用具有调用类型参数参数“@_INVOKE_TYPE\_ = 1”和参数参数 @_FETCH_ROW_COUNT\_ = n“的SQL Server存储过程来针对游标进行提取, 响应 DRDA AR CNTQRY (Continue Query) 以支持使用者程序的 FETCH 命令,在对名为 QRYDTA (Query Answer Data 的 DRDA CNTQRY 命令的回复中,将单行或多行 (n) 行返回到 DRDA AR设置) 。

为了提高性能,DRDA 服务在可能的情况下每次提取返回多行,除非为单行提取定义了包或游标以支持并发更新。 请参阅下面的 SQL 子句语法和绑定选项的说明。

关闭光标

DRDA 服务通过调用具有调用类型参数“@_INVOKE_TYPE\_ = 2”的SQL Server存储过程来关闭游标,以响应 DRDA AR CLSQRY (Close Query) ,以支持使用者程序的 CLOSE CURSOR 命令,向 DRDA AR 返回对 DRDA CLSQRY 命令的回复,该命令称为 ENDQRYRM (查询回复消息结束) 。

如果 DECLARE CURSOR 语句包含 SQL 子句 WITH HOLD,则 DRDA 服务使用 DECLARE CURSOR GLOBAL 选项定义存储过程。 在这种情况下, 和 SQL Server 将在 DRDA AR 期间保留光标关闭,并在 DRDA AR 期间提交请求以SQL Server连接。

SQL 子句语法

当 DECLARE CURSOR SQL 语句包含 SQL 子句 DECLARE CURSOR FOR SELECT 时,DRDA 服务将在存储过程中包含RETURN_RESULTSET注释。

当 DECLARE CURSOR SQL 语句包含 SQL 子句 WITH HOLD 时,DRDA 服务将在存储过程中包含CURSOR_WITH_HOLD注释。 DRDA 服务使用 DECLARE CURSOR GLOBAL 选项定义存储过程,SQL Server会将游标保留在关闭状态,并在 DRDA AR 期间向 DRDA 服务提交请求以SQL Server连接。

当 DECLARE CURSOR SQL 语句包含 SQL 子句 FOR UPDATE 时,DRDA 服务将在存储过程中包含CURSOR_FOR_UPDATE注释。 DRDA 服务定义没有参数参数 @_FETCH_ROW_COUNT\_ = n“的存储过程。 DRDA 服务每次提取仅返回一行。

根据绑定选项,DRDA 服务将 SQL 子句语法 FOR READ ONLY 和 FOR FETCH ONLY 解释为表示不可更新的游标,DRDA 服务可以根据该游标为每个 CNTQRY 提取多行。 DRDA 服务使用参数 @_FETCH_ROW_COUNT\_ = n“定义存储过程。 DRDA 服务将基于绑定选项,每次提取返回一行或多行。

DECLARE C2 CURSOR WITH HOLD FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR READ ONLY  
DECLARE C4 CURSOR WITH HOLD FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR FETCH ONLY DECLARE C8 CURSOR WITH HOLD FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1  

使用包含 fetch 行计数参数的 LMTBLKPRC 定义的 SELECT 语句示例。

包绑定选项

DRDA 服务将 DRDA BGNBND (Begin Bind) 选项 QRYBLKCTL (查询块协议控制) 解释为对游标类型和 SQL 子句语法的替代,指示 DRDA 服务在不可更新游标上每次提取返回一行或每次提取多行。

默认 QRYBLKCTL 为 LMTBLKPRC (有限块查询协议) ,它指示 DRDA 服务为每个查询块返回多行,平均容纳 32K 块的行数减去 DRDA DSS (数据流结构) 定义列数据类型所需的字节数。

(可选)DB2 程序员可以使用 DB2 CURRENTDATA=YES 绑定选项绑定包, 转换为 DRDA BGNBND (Begin Bind) 选项 QRYBLKCTL (查询块协议控制) FIXROWPRC (固定行查询协议) ,指示 DRDA 服务根据 CNTQRY 返回单个 (固定行) , (继续查询) 以响应程序的 SQL FETCH 语句。

不需要游标

如果绑定选项是默认的 LMTBLKPRC,则当语句明确为只读时,数据服务器使用 SELECT 语句定义存储过程,但没有 DECLARE CURSOR。 请参阅下面的 SQL 子句语法和绑定选项的说明。

DECLARE C1 CURSOR FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR READ ONLY  
DECLARE C3 CURSOR FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR FETCH ONLY  
DECLARE C7 CURSOR FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1  
  

不需要SQL Server游标的 SELECT 语句示例。