【问题标题】:Sybase ASE for update cursor that crashes用于崩溃的更新游标的 Sybase ASE
【发布时间】:2016-06-01 10:16:48
【问题描述】:

我刚刚遇到了 ASE(版本 15.7 ESD 15.2)使用更新游标的奇怪行为。
最后我找到了根本原因,但我想把它贴在这里,因为它很有用,也许有人已经遇到过。

我写了这个简单的“更新”光标:

DECLARE c_contactrule 
CURSOR FOR
SELECT a.id
FROM FTContactRule a, Client b, ClientContact c
WHERE /* join conditions */
AND a.client_id IN ( bla bla bla )
AND a.message_subtype_id ( bla bla bla )
AND /* and so on */
for update of a.preferred_medium_id
go

(我对这篇文章的查询进行了一些总结,以提高可读性)

当然,以后我会一直读取光标值直到结束。

open c_contactrule
fetch c_contactrule into @rule_to_update
while @@sqlstatus = 0
begin
     /* do something */
end
close c_contactrule
deallocate c_contactrule
go

我想你猜到了某个地方有一个update preferred_medium_id where current of

目前,这个查询以一种非常具体的方式崩溃:抛出的消息是“ASE 终止了这个进程”,事实上,他杀死了我的会话!

调查,我发现错误的代码行是第一个fetch into语句。

【问题讨论】:

    标签: crash cursor sybase sap-ase


    【解决方案1】:

    如果 ASE 终止会话,那么您很不幸遇到了 ASE 中的错误。唯一的补救措施是升级到包含修复程序的更新版本。请与技术支持人员确认是否可以识别错误(错误日志中应该有堆栈跟踪)以及是否有可用的修复。

    如果您以不同的方式重写查询,例如导致不同的查询计划,则可能不会遇到错误,但这不能保证(也不是一个非常令人欣慰的解决方案)。

    【讨论】:

      【解决方案2】:

      我终于找到了导致此错误消息的原因,但我仍然认为这是一个错误,因为崩溃是服务器的反应过于强烈。应该有更用户友好的消息或解析错误,但不是静默杀死。

      无论如何,我的测试表明问题是由于我更新了一个不在游标的选择语句中的字段:

      select a.id
      ....
      for update of a.preferred_medium_id
      

      我刚刚在选择列表中添加了该字段,当然我在 fetch into 中添加了一个变量,它工作正常。

      select a.id, a.preferred_medium_id
      ....
      for update of a.preferred_medium_id
      

      但是,当您不需要对变量执行任何操作时,必须在变量中保存一个值有点奇怪。

      另外,终止会话不是来自服务器的良好响应。如果有这方面的语法规则,那么我们应该有一个解析错误说“你不能更新一个字段,它不在你选择的列表中,以便取消更新光标”

      【讨论】:

        猜你喜欢
        • 2019-11-20
        • 2020-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多