【问题标题】:How to Run Multiple Dynamic Queries in a PostgreSQL Function如何在 PostgreSQL 函数中运行多个动态查询
【发布时间】:2022-11-23 18:37:22
【问题描述】:

我在弄清楚如何在单个函数中运行多个动态查询时遇到了一些问题。

 CREATE OR REPLACE FUNCTION cnms_fy22q2.test_function(
    fyq text)
    RETURNS void
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE 
AS $BODY$
BEGIN
 -- logic
    TRUNCATE TABLE 'schema_' || fyq || '.my_table'
    DROP TABLE 'schema_' || fyq || '.my_table';
END;
$BODY$; 

我通常会收到语法错误,例如 ERROR: syntax error at or near ...。我在这里做错了什么?

【问题讨论】:

  • 除了实际上没有使用动态 SQL 之外,您的第一个动态查询也缺少分号

标签: postgresql function dynamic-sql


【解决方案1】:

您不能简单地连接字符串来生成动态 sql 语句。看看EXECUTEEXECUTE IMMEDIATE

在您的情况下,您可以这样使用它:

CREATE OR REPLACE FUNCTION cnms_fy22q2.test_function(
    fyq text)
    RETURNS void
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE
AS $BODY$
BEGIN
    -- logic
    EXECUTE 'TRUNCATE TABLE schema_' || fyq || '.my_table';
    EXECUTE 'DROP TABLE schema_' || fyq || '.my_table';
END
$BODY$; 

【讨论】:

  • 这两个都很好用,但我给你的支票是因为它遵循了我原来的方法。
【解决方案2】:

使用将返回一个字符串并在您的函数中执行的格式函数。

create function permanently_delete_table(fyq text) RETURNS void
    LANGUAGE plpgsql AS $$
    declare
    begin
         EXECUTE format('TRUNCATE TABLE schema_%s.my_table',fyq); 
         EXECUTE format('DROP TABLE schema_%s.my_table',fyq); 
    end
$$;

演示在sqldaddy.io

【讨论】:

  • 最好使用 %I 而不是 %s 进行正确的转义 (demo)
【解决方案3】:

只是为了添加我想出的第三个选项,它将查询组合在一个 EXECUTE format(); 语句中,这是我想出的:

CREATE OR REPLACE FUNCTION cnms_fy22q2.drop_summary_tables_function(
fyq text)
  RETURNS void
  LANGUAGE 'plpgsql'
  COST 100
  VOLATILE 
AS $BODY$
BEGIN
 -- logic
  EXECUTE format(
  'TRUNCATE TABLE schema_%s.my_table;
  DROP TABLE  schema_%s.my_table', fyq, fyq);
END;
$BODY$; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多