【问题标题】:How to pass a string parameter to plpgsql function?如何将字符串参数传递给 plpgsql 函数?
【发布时间】:2019-08-28 10:12:43
【问题描述】:

我已经完成了从我的数据库复制到 csv 表格的某些行的功能。 我需要将表的名称作为 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;

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

【问题讨论】:

  • 问题不在于传入,问题在于你构建的动态sql。将statement_copy 粘贴到 RAISE NOTICE 中以查看您的 SQL 是什么。

标签: postgresql parameters plpgsql dynamic-sql stored-functions


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。明天我去试试
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多