【问题标题】:Informix: How to average result from Stored ProcedureInformix:如何平均存储过程的结果
【发布时间】: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),但没有成功。出现语法错误。我不确定它的确切语法是什么。非常感谢任何帮助。

【问题讨论】:

    标签: stored-procedures informix user-defined-functions


    【解决方案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,基本上无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多