为语句级匹配填充查询文本

当您使用BIND QUERY命令影响访问路径选择时,您可以增加 Db2 识别匹配SQL语句的可能性。

关于本任务

Db2 修改用于在BIND或PREPARE时匹配的语句文本。 例如,空白、SQL注释和某些子句(如EXPLAIN)将从查询文本中删除。 这些更改使 Db2 能够在BIND和PREPARE处理期间匹配解析的SQL语句。

在绑定查询时,以下应用程序默认值必须与绑定静态 SQL 语句或准备动态 SQL 语句时保持一致:

  • CCSID
  • 小数点
  • 字符串定界符

过程

为了使语句文本能够成功匹配,请使用以下方法:

  • 对于静态SQL语句,以及使用DYNAMICRULES(BIND)选项准备的动态语句,请在DSN_USERQUERY_TABLE中指定以下列,用于指定语句的包信息:
    • PACKAGE
    • 集合
    • 版本

    这些价值观并非硬性要求。 然而,当这些值被指定时, Db2 使用来自 SYSIBM.SYSPACKSTMT 目录表的解析信息来修改语句文本。 如果未指定值,或在BIND QUERY处理期间未找到匹配的包, Db2 将使用应用程序默认模块中指定的值。

    作为绑定查询流程的一部分, Db2 将验证指定的数据包是否包含匹配的语句文本。 如果语句文本不匹配, Db2 会发出消息 DSNT281I ,BIND QUERY命令失败。

    当软件包存在多个版本时,您可以在 VERSION 列的值中指定 *。 Db2 使用 目录表中VERSION列数值最小的包信息来修改语句文本。 SYSIBM.SYSPACKSTMT 如果软件包的其他版本使用不同的选项,则可能无法匹配其他版本的语句。

    当在 DSN_USERQUERY_TABLE 中未指定包上下文时, Db2 使用应用程序的默认模块来修改语句文本。 但是,语句文本不会根据特定包中的语句进行验证。

  • 当您在 DSN_USERQUERY_TABLE 中填充 QUERY_TEXT 列时,请从以下位置选择已解析的查询文本:
    • 对于静态SQL语句,从DBRM或 SYSIBM.SYSPACKSTMT 目录表中选取语句文本。
    • 对于动态 SQL 语句,请从动态语句缓存中选择语句文本。 对于可以用符号(&)替换文字值的语句,请在 Db2 替换文字值后提取语句文本。

    可以在INSERT语句中直接指定文本(例如从应用程序的源代码中复制)。 然而,这种方法降低了语句与提示成功匹配的可能性。

  • 确保语句文本中的对象名称和SQL关键字使用大写字母,尤其是动态SQL语句。