【问题标题】:Sybase select variable logicSybase 选择变量逻辑
【发布时间】:2009-07-21 01:16:17
【问题描述】:

好的,我有一个与我之前遇到的问题有关的问题。我知道如何修复它,但我们在尝试重现该错误时遇到了问题。

我们有一系列基于其他记录创建记录的程序。这些记录通过link_id 链接到主记录。在获取此link_id 的过程中,查询是

select @p_link_id = id --of the parent
from  table
where thingy_id = (blah)

现在,活动表中有多行。有些可以取消。我的代码没有在 select 语句中取消包含取消的行,因此如果以前有取消的行,这些 id 将出现在 select 中。如果我不包括取消的行,总会有一个“打开”记录被选中。 (附加where status != 'C'

这解决了这个问题。但是,我需要能够在我们的开发环境中重现该问题。

我经历了一个过程,我输入了一大堆数据、打开、取消等,试图让这个 select 语句返回一个无效的 id。但是,每当我运行 select 时,id 都是按顺序排列的(生成的序列),但是在发生此错误的情况下,select 语句将似乎是第一个值返回到变量中。

例如。

ID   Status
1    Cancelled
2    Cancelled
3    Cancelled
4    Open

鉴于上述情况,如果我选择我想要的 ID,我想得到“4”。在错误中,结果为 1。但是,即使我输入了 10 条取消的记录,我仍然得到了选择中的最后一条。

在 oracle 中,我知道如果您选择一个变量并返回多条记录,则会出现错误(我认为)。 Sybase 显然可以将多个值赋给一个变量而不会出错。

我认为这与如何从表中选择数据有关,其中没有排序顺序的 id 不会按升序返回,或者有一个 dboption,其中选择一个变量将保存查询的第一个或最后一个值。

编辑:看起来我们可以通过回滚存储过程更改来重现此错误。但是,proc 不会靠近此 link_id 列。对数据库架构的更改是否可能会破坏索引或其他什么?

【问题讨论】:

标签: select variables sybase


【解决方案1】:

如果返回多行,则存储的值将是列表中的最后一个值,根据this

如果您没有指定通过ORDER BY 检索的订单,则返回的订单将在数据库引擎方便时使用。它可能因数据库实例而异。由于数据在数据库块结构中的放置位置,它可能按创建顺序排列,甚至出现“随机”。

故事的寓意:

  1. 总是让单例SELECTs 返回单行
  2. 当 #1 无法完成时,请使用 ORDER BY 以确保您关心的人排在最后

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多