如何将字符串参数传递给 plpgsql 函数?

How to pass a string parameter to plpgsql function?

我已经完成了一个功能,可以将 table 的一些行从我的数据库复制到 csv。 我需要将 table 的名称作为 TEXT 参数传递。

我在这种模式下从 SQL Workbench/J 调用我的函数:

select save_audit_deletions(1000, 'deliveries_audits');

但是我有这个错误:

执行SQL命令时出错:

 select save_audit_deletions(1000, 'deliveries_audits')
 ERROR: relation "table_name" does not exist
 Where: PL/pgSQL function save_audit_deletions(numeric,text) line 10 at SQL statement

这是我的功能:

CREATE OR REPLACE FUNCTION public.save_audit_deletions(days numeric, table_name text)
  RETURNS void
  LANGUAGE plpgsql
AS
$body$
DECLARE
   interval INT;
   statement_copy text;
   statement_count text;
   copied_rows INTEGER; --number of rows copied by COPY
   backup_rows INTEGER; --number of rows that COPY needs to copy into csv
BEGIN

  UPDATE table_name SET backup = 1 WHERE backup = 0 AND creationdate >= now()::DATE - days AND creationdate < now()::DATE;

  statement_copy := 'COPY (SELECT * FROM ' || table_name || ' WHERE backup = 1) TO ''\var\audiobays\logs\audit\' || table_name || '_deletions_(' || date-days|| ').csv'' CSV DELIMITER '','' HEADER;';
  execute statement_copy
  into copied_rows;

  statement_count := 'SELECT COUNT (*) FROM ' || table_name || ' WHERE backup = 1';
  execute statement_count
  into backup_rows;

    IF copied_rows = backup_rows THEN
        DELETE FROM table_name WHERE backup = 1;
    ELSE
        UPDATE table_name SET backup = 0 WHERE backup = 1;
    END IF;
END;
$body$
  VOLATILE
  COST 100;

COMMIT;

如何将参数传递给函数以允许函数工作? 谢谢。

您不能直接将 table 名称用作字符串。在您的示例中,查询查找名称为 table_name 的 table,而不是具有参数值的 table。

但是你可以创建一个动态的SQL字符串并执行它:

EXECUTE format(
    'UPDATE %I SET backup = 1 ...',
    table_name
);