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】:
您不能在不修改表本身的情况下更改结果集。在发出 DELETE
或 UPDATE
WHERE CURRENT OF
时,您实际上是在删除或更新基础表中的行。
使用WHERE CURRENT OF
意味着循环遍历结果集中的行。请注意,一旦更改了光标位置,新位置将返回给调用者。换句话说,在过程本身消费结果集后,需要再次打开游标才能将结果集返回给调用者。
【讨论】:
您是说该过程将返回一个包含基表中不再存在的行的结果集? @WarrenT 不,我当然不是这么说的。结果集反映了表中的内容。我想我会稍微修改一下我的回复。对我来说,原始问题的措辞方式表明 OP 以某种方式期望修改结果集而不是表格;可能是我误解了。更重要的是,一旦结果集被使用,例如通过遍历它并发布更新或删除,需要再次打开游标以便将 [new] 结果集返回给调用者。 那很好。否则你可能会把我扔进一个循环;-) 嗯,存储过程返回包含表中不再存在的行的结果集并非不可能......也就是“脏读”。但是 AFAIK 它需要两个独立的过程。以上是关于db2 你可以在同一个存储过程中更改游标结果集吗?的主要内容,如果未能解决你的问题,请参考以下文章