在动态 sql PostgreSQL 中创建函数
Create function in dynamic sql PostgreSQL
是否可以在 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; $$;
您的代码中有三层嵌套字符串。处理该问题的最佳方法是对其中的 all 使用 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;
$$;
您还忘记声明 returned 数据类型。如果函数没有 return 任何东西,你需要使用 returns void
.
是否可以在 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; $$;
您的代码中有三层嵌套字符串。处理该问题的最佳方法是对其中的 all 使用 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;
$$;
您还忘记声明 returned 数据类型。如果函数没有 return 任何东西,你需要使用 returns void
.