IBM DB2 for LUW 11.5 - 在复合 SQL 块主体中运行 CALL SYSPROC.ADMIN_CMD 会出现“尝试执行不允许的语句”错误

问题描述 投票:0回答:2

我是 DB2 新手。我遇到了一个问题,我正在尝试编写一个复合语句,该语句可以重组数据库中具有 REORG_PENDING='Y' 状态的所有表。

单独运行 CALL

SYSPROC.ADMIN_CMD('REORG TABLE TABLENAME');
效果很好。

但是当我在复合 SQL 块中运行它时,就像这样..

BEGIN ATOMIC
  CALL SYSPROC.ADMIN_CMD('REORG TABLE TABLENAME');
END@

我收到以下错误:

Routine "SYSPROC.ADMIN_CMD" (specific name "ADMIN_CMD") attempted to execute a statement that is not allowed. SQLCODE=-751, SQLSTATE=  , DRIVER=4.33.31

我的理解是,如果我想使用

FOR
循环为每个具有正重组挂起状态的表运行
SYSPROC.ADMIN_CMD
,则
FOR
必须嵌入到 SQL 过程或复合 SQL 语句中。然而,在复合 SQL 语句中运行
SYSPROC.ADMIN_CMD
总是会出现此错误。这个语句在块外与块内工作有什么原因吗?

sql db2 db2-luw
2个回答
1
投票

答案是使用编译块,即

BEGIN
,而不是
BEGIN ATOMIC
块(也称为内联块)。
BEGIN ATOMIC
标识内联块,而
BEGIN
本身标识编译块的开始。

Db2-LUW 有两种复合 SQL,“compound-SQL 编译”和“compound-SQL 内联”。 每个人都有不同的意图、不同的能力、不同的限制。复合 SQL 也可以在嵌入式 SQL 程序(需要预编译器)中使用,但这是一个单独的主题。

编译后,复合 SQL 编译块将其可执行形式以离散的

package
形式存储在数据库目录中(该包就是可运行代码)。 编译块比内联块具有更多的功能/功能范围/语法。

相比之下,复合 SQL 内联块不会有离散的可执行包,因为它在运行时被合并到不同 SQL 语句的主体中(即插入、更新、删除、合并)。另外,内联块将以原子方式执行,这就是对内联复合 SQL 的可能性有许多记录在案的限制的原因之一。


0
投票

发生该错误的原因是 CALL SYSPROC.ADMIN_CMD 是 DB2 LUW 11.5 中复合 SQL 块内的“禁止语句”。此限制可确保事务完整性,因为 ADMIN_CMD 执行高权限操作。

解决方案:

1.移出块:在复合SQL块之前或之后运行CALL SYSPROC.ADMIN_CMD。 sql代码: CALL SYSPROC.ADMIN_CMD('重组表 my_table'); 开始原子 -- 其他操作 结束;

2.使用包装过程:将ADMIN_CMD封装在存储过程中并单独调用。 sql代码: 创建过程 RUN_REORG() 开始调用 SYSPROC.ADMIN_CMD('REORG TABLE my_table');结尾; 调用 RUN_REORG();

3.事务分离:将 ADMIN_CMD 保留在独立事务中,以实现无冲突执行。

有关 DB2 性能调优和高级 SQL 概念的深入指导,请浏览 VTUIT.COM 上的 DB2 LUW 管理员课程。

© www.soinside.com 2019 - 2024. All rights reserved.