我成功地在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)
答案 0 :(得分:0)
因为第一次调用函数时会编译函数。否则就不可能定义一组递归函数,其中一个调用另一个:)。
编辑(感谢Nick Barnes):与问题有点无关,有一个开关SET check_function_bodies = true;
但这只能启用PL / pgSQL函数的基本语法检查。尽管如此,绑定将在第一次调用时完成。 Postgres只会尝试解析LANGUAGE sql的函数/表名。
答案 1 :(得分:0)
PLpgSQL仅在验证时检查嵌入式SQL的语法。在运行时第一次评估之前立即检查语义标识符,函数.......您可以搜索 plpgsql_check 扩展名。它完成了对嵌入式SQL的检查。