postgresql - 在数组中传递表名

标签 postgresql plpgsql dynamic-sql sql-delete

我需要对一组表执行相同的删除或清除操作(基于多个条件)。为此,我尝试将数组中的表名传递给函数。我不确定我做得是否正确。或者有更好的办法吗?

我只是粘贴一个示例,这不是我编写的真正函数,但基本如下所示:

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.

截断

由于您要从表中删除所有行,因此请考虑使用TRUNCATEPer 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}');

此处说明:
Table name as a PostgreSQL function parameter

关于postgresql - 在数组中传递表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23723851/

相关文章:

postgresql - Postgres/Flyway : How can I wrap long constant strings in sql file?

postgresql - Postgres : Returning Results or Error from Stored Functions

postgresql - EXECUTE 的查询字符串参数为空

sql - 在 SQL 语句中构建动态 where 条件

php - 问题 : Writing a MySQL parser to split JOIN's and run them as individual queries (denormalizing the query dynamically)

sql - PostgreSQL-动态sql内部函数?

postgresql - 更新/升级 brew 后如何修复 postgres

Postgresql 子查询

postgresql - 在没有 foreach 的情况下循环遍历数组参数

sql - 关系不存在 PLPGSQL