从另一个函数创建一个函数

Ske*_*eve 4 postgresql ddl plpgsql functions

是否可以从另一个 plpgsql 函数创建一个新函数?像这样的东西:

CREATE OR REPLACE FUNCTION func_test()
RETURNS VOID AS
$BODY$
BEGIN
  CREATE OR REPLACE FUNCTION func_test2()
  RETURNS INT AS
  BEGIN
  $$
    SELECT 1;
  $$
  END
END
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

当我执行上面的代码时,我得到:

ERROR:  unexpected end of function definition at end of input
LINE 13: $BODY$`
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 6

是的,完全有可能。你只是有一些随机的语法错误。

我自由地将查询中的术语“存储过程”替换为“函数”,因为 Postgres 没有存储过程。只是功能 - 几乎但不完全相同。

这会起作用:

CREATE OR REPLACE FUNCTION func_test()
  RETURNS VOID AS
$func$
BEGIN
  CREATE OR REPLACE FUNCTION func_test2()
     RETURNS INT AS
  $$
    SELECT 1
  $$ LANGUAGE sql;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

或者:

CREATE OR REPLACE FUNCTION func_test()
  RETURNS VOID AS
$func$
BEGIN

CREATE OR REPLACE FUNCTION func_test2()
  RETURNS INT AS
$$
BEGIN
   RETURN (SELECT 1);
END
$$ LANGUAGE plpgsql;

END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

相比: