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 says、explain_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, **?**, ?, ?, ?, ?, ? )
我在尝试使用 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 says、explain_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, **?**, ?, ?, ?, ?, ? )