1

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

我们有一系列基于其他记录创建记录的程序。这些记录通过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 列。对数据库架构的更改是否可能会破坏索引或其他内容?

4

1 回答 1

2

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

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

这个故事的主旨:

  1. 总是让单例SELECT返回单行
  2. 当#1无法完成时,请使用anORDER BY来确保您关心的最后一个
于 2009-07-21T02:39:45.670 回答