我需要对一组表执行相同的删除或清除操作(基于多个条件)。为此,我尝试将数组中的表名传递给函数。我不确定我做得是否正确。或者有更好的办法吗?
我只是粘贴一个示例,这不是我编写的真正函数,但基本如下所示:
CREATE OR REPLACE FUNCTION test (tablename text[]) RETURNS int AS
$func$
BEGIN
execute 'delete * from '||tablename;
RETURN 1;
END
$func$ LANGUAGE plpgsql;
但是当我调用该函数时出现错误:
select test( {'rajeev1'} );
ERROR: syntax error at or near "{"
LINE 10: select test( {'rajeev1'} );
^
********** Error **********
ERROR: syntax error at or near "{"
SQL state: 42601
Character: 179
最佳答案
数组语法
'{rajeev1, rajeev2}'
或 ARRAY['rajeev1', 'rajeev2']
。 Read the manual.
截断
由于您要从表中删除所有行,因此请考虑使用TRUNCATE
。 Per documentation:
Tip:
TRUNCATE
is a PostgreSQL extension that provides a faster mechanism to remove all rows from a table.
一定要研究细节。如果 TRUNCATE
适合您,整个操作就会变得非常简单,因为该命令接受多个表:
TRUNCATE rajeev1, rajeev2, rajeev3, ..
动态删除
否则您需要像您已经尝试过的动态 SQL。可怕的缺失细节:您完全容易遭受SQL注入(inject)和灾难性的语法错误。使用format()
使用 %I
(不是 %s
来清理表名等标识符。或者,在这种特殊情况下,更好的是使用 数组>regclass
作为参数:
CREATE OR REPLACE FUNCTION f_del_all(_tbls regclass)
RETURNS void AS
$func$
DECLARE
_tbl regclass;
BEGIN
FOREACH _tbl IN ARRAY _tbls LOOP
EXECUTE format('DELETE * FROM %s', _tbl);
END LOOP;
END
$func$ LANGUAGE plpgsql;
调用:
SELECT f_del_all('{rajeev1,rajeev2,rajeev3}');
关于postgresql - 在数组中传递表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23723851/