在动态sql PostgreSQL中创建函数

Wal*_*icz 1 sql postgresql dynamic-sql

是否可以在 PostgreSQL 的动态 SQL 中创建函数或执行匿名块?我正在寻找这样的东西:

Create or replace FUNCTION fff(p1 int)
LANGUAGE  plpgsql
  AS $$
  DECLARE
   v_Qry  VARCHAR(4000);
  BEGIN
    v_Qry := '
    Create or replace FUNCTION fff_DYNAMIC_SQL()
    LANGUAGE  plpgsql
    AS $$
    DECLARE
    v1  INTEGER;
    begin
     v1 := ' || p1 || ';
     RETURN;
    END; $$;';
   EXECUTE v_Qry;
   RETURN;
END; $$;
Run Code Online (Sandbox Code Playgroud)

小智 5

您的代码中有三层嵌套字符串。解决这个问题的最佳方法是对所有这些都使用美元报价。创建动态 SQL 时,最好使用字符串连接而不是字符串连接。然后你只需要一个带有占位符的字符串,这使得代码更容易阅读。format()

要嵌套多个美元引用的字符串,每次使用不同的分隔符:

Create or replace FUNCTION fff(p1 int)
  returns void
  LANGUAGE  plpgsql
AS
$$ --<< outer level quote
DECLARE
 v_Qry  VARCHAR(4000);
BEGIN
  v_Qry := format(
$string$ --<< quote for the string constant passed to the format function
    Create or replace FUNCTION fff_DYNAMIC_SQL()
       returns void
       LANGUAGE  plpgsql
    AS 
    $f1$ --<< quoting inside the actual function body
    DECLARE
      v1  INTEGER;
    begin
      v1 := %s;
      RETURN;
    END; 
    $f1$
$string$, p1);
  EXECUTE v_Qry;
  RETURN;
END; 
$$;
Run Code Online (Sandbox Code Playgroud)

您还忘记声明返回的数据类型。如果该函数没有返回任何内容,则需要使用returns void.