Generating/Populating 解释 DB2 中的表和 db2exfmt 的用法

Generating/Populating Explain tables in DB2 and usage of db2exfmt

我在尝试使用 db2exfmt 工具收集解释计划时遇到问题。

有人可以向我解释一下如何使用该工具的过程吗?

我的要求是收集存储过程的成本。我在实例 'XYZ' 模式中创建了 EXPLAIN 表,我有一个名为 "UNNAMED" 的过程,它具有包名称 "P123456" 和模式 "ABCD"。

我使用了以下命令:

! db2exfmt -d SAMPLE -e DB2INST1 -s ABCD -n P123456 -g TIC -w -1 -#***5*** -t

其中 5 是我要为其收取费用的程序部分的部分编号。

此外,我还尝试过以下操作:

1) 识别存储过程对应的包:

select r.routineschema, r.routinename, rd.bname as packagename 
from syscat.routines r, syscat.routinedep rd 
where 
    r.specificname=rd.specificname and
    r.routineschema=rd.routineschema and 
    rd.btype='K' and 
    r.routineschema = 'XYZ' and 
    r.routinename = 'ABCD'

2) 确定 SQL 语句的节号:

select sectno, text 
from syscat.statements 
where pkgschema='XYZ' and pkgname='P123456'

3) 填充说明表:

call EXPLAIN_FROM_CATALOG( 'XYZ', 'P123456', ' ', 5, 'SYSTOOLS', ?, ?, ?, ?, ? )  

后者报错:

Message: The parameter mode OUT or INOUT is not valid for a parameter in the routine named "EXPLAIN_FROM_CATALOG" with specific name "EXPLAIN_FROM_CATALOG" (parameter number "5", name "EXPLAIN_SCHEMA").. SQLCODE=-469, SQLSTATE=42886, DRIVER=3.50.152

我以 USER 身份登录:"MNO" 并希望填充 SYSTOOLS 模式下的解释表。

有人可以帮我解决这个问题吗?

如错误消息所示,the manual saysexplain_schema 是一个 INOUT 参数,因此您不能指定文字值。

您可能想尝试将过程调用包装在复合语句中,为每个 OUT 和 INOUT 参数提供声明的变量,例如:

begin
  declare v_schema varchar(50) default 'SYSTOOLS';
  declare v_req, v_srcname, v_srcschema, v_srcver varchar(128);
  declare v_ts timestamp;

  call EXPLAIN_FROM_CATALOG( 'XYZ', 'P123456', ' ', 5, v_schema,
                             v_req, v_ts, v_srcname, v_srcschema, v_srcver );
end

PS。代码未经测试

您必须用“?”指定每个 IN/OUT 参数。 - 运行 然后它会提示您输入值 ('SYSTOOLS')。 所以试试

call EXPLAIN_FROM_CATALOG( 'XYZ', 'P123456', ' ', 5, **?**, ?, ?, ?, ?, ? )