如何将字符串参数传递给 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
);
我已经完成了一个功能,可以将 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
);