sql - 在动态 sql PostgreSQL 中创建函数

标签 sql postgresql dynamic-sql

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

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; $$;

最佳答案

您的代码中有三层嵌套字符串。处理这个问题的最好方法是使用 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

关于sql - 在动态 sql PostgreSQL 中创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48689513/

相关文章:

sql - 在选择处或附近执行子查询错误时,Postgres 说明错误

sql - 最好有一个 bool 值(重要标志),如属性或在单独的表中?

c++ - 使用可为 Null 的参数调用 PL/PGSQL 函数

sql - 复杂的 sp_executesql - 容易受到注入(inject)?

mysql - 需要有关 mysql 模式设计的帮助 - 当前模式需要触发器中的动态 sql

MySQL Select - 数字时合并行

php - 如何获取特定日期范围内的记录

SQL Select - 当前日期 - 7 年

java - 如何在java项目中使用netbeans使用ip地址而不是名称来指定主机连接到postgres数据库?

mysql - 在 mysql 上创建触发器时,存储函数或触发器问题中​​不允许使用动态 SQL