“Order by”在Console中有效,但在Stored Procedures中不起作用

时间:2015-11-24 11:54:53

标签: sql stored-procedures sql-order-by informix

我在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中执行查询(使用存储过程),我会在“和/ date1 BETWEEN(CURRENT - 1)的行中出现sintaxis错误单位年份和当前“。但真正的问题在于 ORDER BY field1 desc;

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

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

先谢谢!

1 个答案:

答案 0 :(得分:3)

当您通过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