【问题标题】:db2 doesn't allow to use function in a stored proceduredb2 不允许在存储过程中使用函数
【发布时间】:2013-03-25 01:09:35
【问题描述】:

我有以下错误

   An unexpected token "table" was found following "elect .."

这是在下面的代码之后产生的。 如果我调用该函数,它可以正常工作

   --example
   select * from foo('2013-02-20')

但是当我将它插入存储过程时,它就无法工作了。 是否允许调用像我在下面所做的那样的函数?

   create function foo( my_date date ) returns table(data integer) 
   language sql READS SQL DATA  return select id,sum(value) from table where date=my_date group by id; 

   create procedure list_open_positions(my_date date) 
   LANGUAGE SQL begin select * from table(foo(my_date)); end;

【问题讨论】:

    标签: sql stored-procedures db2


    【解决方案1】:

    存储过程不能包含裸 select 语句,因为它们不直接输出查询结果。

    表函数应该在作为表达式一部分的 select 语句中正常工作。例如:

    create procedure bar(my_date date)
    language sql
    begin
        insert into some_table
             select * from table(foo(my_date));
    end
    

    在不知道您使用的 DB2 的版本和平台的情况下,这个答案并不是 100% 确定的。版本之间在功能/过程中允许的内容存在重大差异。上述示例在 9.7 for LUW 中运行良好。

    【讨论】:

    • 嗨丹!谢谢!你是说原则上我不能创建一个存储过程来打印该函数的结果吗?我想为根本不想处理 SQL 的用户这样做。我的目标是创建一个存储过程来包装该调用并在屏幕上打印结果,而不是运行'db2“select * from table(foo(my_date))'。我认为这是一项愚蠢的任务!!
    • @AbruzzoForteeGentile,没错,你不能那样做。如果您的用户根本不想处理 SQL,您可以创建一个 SQL 文件,然后他们可以运行该文件并查看结果。或者,为了做更多的工作,您可以创建一个小脚本(几乎可以使用任何编程语言)来运行查询并显示结果。
    • 非常感谢。我发现所有的人都在抱怨这件事。我会按照你的建议去做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多