首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"Order“在控制台中工作,但在存储过程中不起作用

"Order“在控制台中工作,但在存储过程中不起作用
EN

Stack Overflow用户
提问于 2015-11-24 11:54:52
回答 1查看 738关注 0票数 1

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

代码语言:javascript
复制
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之间(当前-1个单元年)和当前”之间的行中会出现一个新的错误。但是真正的问题是field1 desc;的顺序

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

注意:字段之所以出现是因为我认为它们对这个问题并不重要。

感谢先进的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 19:09:48

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

在存储过程中,您必须管理此处理。FOREACH循环自动做到这一点。如果使用动态SQL,还可以使用其他语句。

如果SELECT语句可能返回多行,则需要游标管理。如果SELECT语句只返回一行,则可以指定应该接收结果的变量。当SELECT返回单个行时,我注意到ORDER是无关紧要的--如果您有ORDER,就会有一个强有力的假设,即查询可能返回多个行。

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

代码语言:javascript
复制
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;

但是如果有超过一排,你需要:

代码语言:javascript
复制
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;

这将返回:

代码语言:javascript
复制
syscolauth
sysdepend
syssynonyms
syssyntable
systabauth
sysusers
sysviews
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33893032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档