Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在动态sql PostgreSQL中创建函数_Sql_Postgresql_Dynamic Sql - Fatal编程技术网

在动态sql PostgreSQL中创建函数

在动态sql PostgreSQL中创建函数,sql,postgresql,dynamic-sql,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 $$

是否可以在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; $$;

代码中有三层嵌套字符串。处理这一问题的最佳方法是使用所有的。创建动态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; 
$$;
创建或替换函数fff(p1 int)
返回无效
语言plpgsql
作为

$$-代码中有三层嵌套字符串。处理这一问题的最佳方法是使用所有的。创建动态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; 
$$;
创建或替换函数fff(p1 int)
返回无效
语言plpgsql
作为

$$--是的,这是可能的。当你尝试的时候发生了什么?@a_horse_和_no_name我得到了错误:语法错误在或接近“DECLARE”第11行:DECLAREYes,这是可能的。当你尝试时发生了什么?@a_horse_和_no_name我得到了错误:语法错误在或靠近“DECLARE”行11:DECLARE