我正在尝试使用 DB2 在 AIX 上编译 .sqc 文件 出现 sql 错误 SQL0511N “不允许使用 FOR UPDATE 子句,因为无法修改游标指定的表。SQLSTATE=42829” 在“FETCH FIRST :host_variable_int ROWS ONLY”上使用 host_variable_int 声明游标时,但相同的语句是当传递 number 而不是 host_variable 时进行编译,如“FETCH FIRST 40 ROWS ONLY”。 错误 SQL 语句:
EXEC SQL DECLARE cursor_name CURSOR WITH HOLD FOR SELECT a.coulmn_names FROM TABLE_NAME a WHERE a.TABLE_COLUMN_1 = :host_variable AND a.TABLE_COLUMN_2 IN ( SELECT b.coulmn_names FROM TABLE_NAME b WHERE b.TABLE_COLUMN_1 = :host_variable AND a.TABLE_COLUMN_3 = b.TABLE_COLUMN_3) FETCH FIRST **:host_variable_int** ROWS ONLY FOR UPDATE OF coulmn_name;
无错误 SQL 语句:
EXEC SQL DECLARE cursor_name CURSOR WITH HOLD FOR SELECT a.coulmn_names FROM TABLE_NAME a WHERE a.TABLE_COLUMN_1 = :host_variable AND a.TABLE_COLUMN_2 IN ( SELECT b.coulmn_names FROM TABLE_NAME b WHERE b.TABLE_COLUMN_1 = :host_variable AND a.TABLE_COLUMN_3 = b.TABLE_COLUMN_3) FETCH FIRST **40** ROWS ONLY FOR UPDATE OF coulmn_name;
我不确定这两个游标声明语句有什么区别 有人对此有任何想法吗? 预先感谢
对于 Db2 的当前版本,这是预期结果。您不能将主机变量用于
fetch first
行计数。
在 Db2 中,根据 documentation,fetch-clause 对于 fetch-row-count 有这种语法。
获取行数 指定要检索的最大行数的表达式。表达式不得包含列引用、 scalar-fullselect,一个非确定性的函数,一个函数 具有外部操作或序列引用 (SQLSTATE 428H7)。 该数值必须是正数或零 (SQLSTATE 2201W)。 如果表达式的数据类型不是 BIGINT,则结果 表达式被转换为 BIGINT 值。当省略 fetch-row-count 时, 它相当于 1。
如果你想改变获取的第一个值,你必须使用动态SQL,而不能使用静态SQL。