2012-11-12 43 views
1

假设我有这个功能sp_func(startdate, enddate)。 要调用函数本身,我使用CALL sp_func(startdate, enddate);Informix:如何平均来自存储过程的结果

该函数将返回一个表,包括:

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

我想要做的就是从功能平均的时间。 我试过SELECT AVG(time) FROM sp_func(startdate, enddate),但没有奏效。发生语法错误。我不确定这是什么确切的语法。任何帮助是极大的赞赏。

回答

0

魔术关键字是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子句是必需的,即使过程命名了它的返回值。

此语法在第2章的SELECT语句下的Informix SQL指南:语法手册中进行了介绍,子标题是'Iterator Functions(IDS)'(ids-sqs_bookmap副本中的p2-638我有11.70的.pdf)。

+0

感谢您的清理和答复。我能够运行你的虚拟功能,并选择很好。但是当我尝试使用SP时,我在spl例程中收到了非法的sql语句。顺便说一句,a.TIME < - 为什么'时间'需要用大写字母?我检查了sp_func的位置,它位于'FUNCTION'文件夹中,而不是在TABLE文件夹中。这是问题的原因吗? – johndoe

+0

TIME不需要大写; SQL不区分大小写。我只有一个SQL格式化程序,它将TIME作为关键字进行识别,并且我没有转换为小写或混合大小写。有些语句在将用作迭代函数的例程中是不允许的。我认为更新操作是被禁止的。所以可能是DDL语句。鉴于程序的主体,我可能很快就会猜出哪个是令人头痛的陈述。功能与程序的选择是AFAIK,基本上不重要。 –