db2 你可以在同一个存储过程中更改游标结果集吗?

Posted

技术标签:

【中文标题】db2 你可以在同一个存储过程中更改游标结果集吗?【英文标题】:db2 can you change cursor resultset in same stored procedure? 【发布时间】:2014-01-30 15:04:35 【问题描述】:

我有一个存储过程,它使用

从数据库中选择数据
DECLARE cursor1 CURSOR WITH RETURN for SELECT...

OPEN cursor1

此时我想在同一个存储过程中删除和更改结果集中的记录。我无法在选择中进行这些更改。

可以这样做吗?

见过

DELETE WHERE CURRENT OF cursor1

但 Data Studio 不喜欢这种语法并将“OF”下划线视为错误。我相信 Data Studio 的版本只有几个月的历史。

感谢您的帮助或指导。

【问题讨论】:

你为什么不能从SELECT 中排除一些东西(只是没有得到那些行)?否则,如果您不想修改基础数据,将其转储到临时表中可能会更好。 【参考方案1】:

您不能在不修改表本身的情况下更改结果集。在发出 DELETEUPDATE WHERE CURRENT OF 时,您实际上是在删除或更新基础表中的行。

使用WHERE CURRENT OF 意味着循环遍历结果集中的行。请注意,一旦更改了光标位置,新位置将返回给调用者。换句话说,在过程本身消费结果集后,需要再次打开游标才能将结果集返回给调用者。

【讨论】:

您是说该过程将返回一个包含基表中不再存在的行的结果集? @WarrenT 不,我当然不是这么说的。结果集反映了表中的内容。我想我会稍微修改一下我的回复。对我来说,原始问题的措辞方式表明 OP 以某种方式期望修改结果集而不是表格;可能是我误解了。更重要的是,一旦结果集被使用,例如通过遍历它并发布更新或删除,需要再次打开游标以便将 [new] 结果集返回给调用者。 那很好。否则你可能会把我扔进一个循环;-) 嗯,存储过程返回包含表中不再存在的行的结果集并非不可能......也就是“脏读”。但是 AFAIK 它需要两个独立的过程。

以上是关于db2 你可以在同一个存储过程中更改游标结果集吗?的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程返回游标,取值报错

在 ibm db2 上的游标中立即执行

MySQL 存储过程,获取使用游标查询的结果集

oracle 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。

DB2 - 在光标中聚合大小写

我可以将存储过程的结果放入 SQL 中另一个存储过程中的游标中吗