"Order by" 在控制台中有效,但在存储过程中无效
"Order by" works in Console but doesn't work in Stored Procedures
我在 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 行中出现 sintaxis 错误(当前 - 1 个单位年) 和当前 " . 但真正的问题是 ORDER BY field1 desc;
我不知道为什么,但是当您在其中使用 Order by 时,有时存储过程 return 会出错。
注意:发明字段是因为我认为它们对问题并不重要。
在此先致谢!
当您通过 DB-Access 或等效程序 运行 SELECT 语句时,程序会负责创建游标、打开游标、获取数据、关闭游标以及释放游标使用的资源。
在存储过程中,您必须管理此处理。 FOREACH 循环会自动执行此操作。如果您使用的是动态 SQL,还可以使用其他语句。
如果一个SELECT语句可能return多行,则需要游标管理。如果 SELECT 语句 return 只是一行,您可以指定哪个变量应该接收结果。我观察到当 SELECT return 是一行时 ORDER BY 是无关紧要的——如果你有一个 ORDER BY,就会有一个强有力的假设,即查询可能 return 不止一行.
例如,此存储过程有效(和 returns 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;
这个returns:
syscolauth
sysdepend
syssynonyms
syssyntable
systabauth
sysusers
sysviews
我在 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 行中出现 sintaxis 错误(当前 - 1 个单位年) 和当前 " . 但真正的问题是 ORDER BY field1 desc;
我不知道为什么,但是当您在其中使用 Order by 时,有时存储过程 return 会出错。
注意:发明字段是因为我认为它们对问题并不重要。
在此先致谢!
当您通过 DB-Access 或等效程序 运行 SELECT 语句时,程序会负责创建游标、打开游标、获取数据、关闭游标以及释放游标使用的资源。
在存储过程中,您必须管理此处理。 FOREACH 循环会自动执行此操作。如果您使用的是动态 SQL,还可以使用其他语句。
如果一个SELECT语句可能return多行,则需要游标管理。如果 SELECT 语句 return 只是一行,您可以指定哪个变量应该接收结果。我观察到当 SELECT return 是一行时 ORDER BY 是无关紧要的——如果你有一个 ORDER BY,就会有一个强有力的假设,即查询可能 return 不止一行.
例如,此存储过程有效(和 returns 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;
这个returns:
syscolauth
sysdepend
syssynonyms
syssyntable
systabauth
sysusers
sysviews