Postgres 8.4创建了一个调用不存在函数的函数

时间:2015-12-16 10:41:24

标签: database postgresql

我成功地在PG 8.4.x中创建了以下功能

CREATE OR REPLACE FUNCTION foo()
RETURNS VOID
AS $function$
BEGIN
    select concat('a','b');
END;$function$
LANGUAGE plpgsql;

创建函数时没有任何错误 但是当我尝试使用我得到的功能时:

select foo();
ERROR:  function concat(unknown, unknown) does not exist
LINE 1: select concat('a','b')             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
QUERY:  select concat('a','b')
CONTEXT:  PL/pgSQL function "foo" line 2 at SQL statement

PG如何成功创建一个实际调用未知函数的函数? (仅在PG 9.x中支持CONCAT)

2 个答案:

答案 0 :(得分:0)

因为第一次调用函数时会编译函数。否则就不可能定义一组递归函数,其中一个调用另一个:)。

编辑(感谢Nick Barnes):与问题有点无关,有一个开关

SET check_function_bodies = true;

但这只能启用PL / pgSQL函数的基本语法检查。尽管如此,绑定将在第一次调用时完成。 Postgres只会尝试解析LANGUAGE sql的函数/表名。

答案 1 :(得分:0)

PLpgSQL仅在验证时检查嵌入式SQL的语法。在运行时第一次评估之前立即检查语义标识符,函数.......您可以搜索 plpgsql_check 扩展名。它完成了对嵌入式SQL的检查。