Informix:如何平均存储过程的结果

Posted

技术标签:

【中文标题】Informix:如何平均存储过程的结果【英文标题】:Informix: How to average result from Stored Procedure 【发布时间】:2012-11-12 03:06:37 【问题描述】:

假设我有这个函数sp_func(startdate, enddate)。 要调用函数本身,我使用CALL sp_func(startdate, enddate);

该函数将返回一个包含以下内容的表:

id   name      time
1    smith     3.2
2    neo       8.2
3    morpheus  2.4

我想做的是平均该函数的时间。 我尝试使用SELECT AVG(time) FROM sp_func(startdate, enddate),但没有成功。出现语法错误。我不确定它的确切语法是什么。非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

魔术关键字是TABLE。这是一个演示解决方案的脚本:

虚拟程序

CREATE PROCEDURE sp_func(begin_date DATE, end_date DATE)
    RETURNING INTEGER AS id, VARCHAR(10) AS NAME, DECIMAL(5,2) AS TIME;

    RETURN 1, "smith",     3.2 WITH RESUME;
    RETURN 2, "neo",       8.2 WITH RESUME;
    RETURN 3, "morpheus",  2.4;

END PROCEDURE;

EXECUTE PROCEDURE sp_func('2012-01-01', '2012-12-31');

输出

1   smith      3.20
2   neo        8.20
3   morpheus   2.40

主 SELECT 语句

SELECT AVG(a.TIME)
FROM TABLE(PROCEDURE sp_func('2012-01-01', '2012-12-31')) AS A(id, name, time)
;

输出

4.6

带有列名的 AS 子句是必要的,即使过程命名了它的返回值。

该语法记录在 Informix Guide to SQL: Syntax 手册中,在第 2 章的 SELECT 语句下,子标题是“迭代器函数 (IDS)”(ids-sqs_bookmap.txt 副本中的 p2-638)。我有 11.70 的 pdf)。

【讨论】:

感谢您的清理和回答。我能够运行你的虚拟函数并选择就好了。但是当我尝试使用我的 SP 时,我在 spl 例程中得到了非法的 sql 语句。顺便说一句,a.TIME TIME 不需要大写; SQL 不区分大小写。我只有一个将 TIME 识别为关键字的 SQL 格式化程序,但我没有转换为小写或混合大小写。在将用作迭代器函数的例程中,有些语句是不允许的。我认为禁止更新操作;所以可能是 DDL 语句。鉴于程序的主体,我可能很快就能猜到哪个是麻烦的陈述。 FUNCTION 与 PROCEDURE 的选择是,AFAIK,基本上无关紧要。

以上是关于Informix:如何平均存储过程的结果的主要内容,如果未能解决你的问题,请参考以下文章

Informix SQL / 在另一个查询中重用存储过程的结果

Informix SQL / 在表中插入存储过程的结果

如何从 Perl 调用 Informix 存储过程?

如何在 Informix 中正确输入存储过程参数?

Informix:在 Java 中使用存储过程

在 Informix 中创建 TEMP 存储过程