“排序依据”在控制台中有效,但在存储过程中无效

Posted

技术标签:

【中文标题】“排序依据”在控制台中有效,但在存储过程中无效【英文标题】:"Order by" works in Console but doesn't work in Stored Procedures 【发布时间】:2015-11-24 11:54:52 【问题描述】:

我在 Informix 中执行存储过程时遇到问题。我正在做一个简单的查询,它不起作用。这是查询:

SELECT 
    first 1 field1, 
    date1 
FROM 
    historia_t 
WHERE 
    field3     = 1 
    AND field4 = 1 
    AND date1 BETWEEN (CURRENT - 1 UNITS YEAR) AND CURRENT 
ORDER BY 
    field1 desc 

如果我在 DbVisualizer 中执行查询,我没有任何问题,但如果我在 Informix(使用存储过程)中执行查询,我会在 " AND date1 BETWEEN (CURRENT - 1 UNITS YEAR) AND CURRENT " . 但真正的问题在于 ORDER BY field1 desc;

我不知道为什么,但是当您在其中使用 Order by 时,有时存储过程会返回错误。

注意:发明字段是因为我认为它们对问题并不重要。

提前致谢!

【问题讨论】:

如果我将语句用 FOR EACH 进行四舍五入,则查询有效。这就像 Informix 期望几个结果并强迫我把它放在 FOR EACH 中一样。没看懂…… 【参考方案1】:

当您通过 DB-Access 或等效程序运行 SELECT 语句时,程序会负责创建游标、打开游标、获取数据、关闭游标并释放使用的资源。

在存储过程中,您必须管理此处理。 FOREACH 循环会自动执行此操作。如果您使用的是动态 SQL,则可以使用其他语句。

如果 SELECT 语句可能返回多行,则需要游标管理。如果 SELECT 语句只返回一行,您可以指定哪个变量应该接收结果。我观察到,当 SELECT 返回单行时,ORDER BY 无关紧要——如果您有 ORDER BY,则强烈假设查询可能返回多行。

例如,这个存储过程有效(并返回syssynonyms):

create procedure fk2() returning varchar(128) as tabname;
    define t varchar(128);
    select tabname into t from informix.systables where tabid = 9;
    return t;
end procedure;

但是在多于一排的情况下,您需要:

create procedure fk3() returning varchar(128) as tabname;
    define t varchar(128);
    foreach select tabname into t
              from informix.systables
             where tabid between 4 and 10
             order by tabname   # No semicolon permitted (don't ask!)
        return t with resume;
    end foreach;
end procedure;

这会返回:

syscolauth
sysdepend
syssynonyms
syssyntable
systabauth
sysusers
sysviews

【讨论】:

读了几遍之后,我不明白这个解释。我不明白它是如何工作的,但这很奇怪,因为它并不明确,尽管它很简单。非常感谢@JonathanLeffler。

以上是关于“排序依据”在控制台中有效,但在存储过程中无效的主要内容,如果未能解决你的问题,请参考以下文章

存储在 plist 中的数据在模拟器中有效,但在设备中无效

ssh 密钥密码在 Windows 中有效,但在 linux 中无效

使用 AVAudioPlayer 播放的音频在 iPhone 模拟器中有效,但在设备中无效

为啥我的异步代码在控制器中有效,但在模型中无效?

react native fcm在android上有效,但在ios上无效

Python 脚本在 IDE 中有效,但在内置可执行文件时无效?