代码之家  ›  专栏  ›  技术社区  ›  Walentyna Juszkiewicz a_horse_with_no_name

在动态sql PostgreSQL中创建函数

  •  0
  • Walentyna Juszkiewicz a_horse_with_no_name  · 技术社区  · 8 年前

    是否可以在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; $$;
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Walentyna Juszkiewicz a_horse_with_no_name    8 年前

    代码中有三层嵌套字符串。解决这个问题的最好方法是 dollar quoting 对于 全部的 其中之一。创建动态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; 
    $$;
    

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