我想创建一个函数来创建一个具有特定结构的表,将表名的一部分作为参数传递,因此表名是 t_ 。与此类似:
CREATE OR REPLACE FUNCTION create_table_type1(t_name VARCHAR(30)) RETURNS VOID AS $$
BEGIN
EXECUTE "CREATE TABLE IF NOT EXISTS t_"|| t_name ||"
(
id SERIAL,
customerid INT,
daterecorded DATE,
value DOUBLE PRECISION,
PRIMARY KEY (id)
)"
END
$$ LANGUAGE plpgsql
然后这样称呼它:
SELECT create_table_type1('one');
可能吗?
答案是肯定的。:)
我使用
format()
with%I
来清理表名并避免 SQL 注入。需要 PostgreSQL 9.1 或更高版本。请务必使用单引号(
''
) 表示数据。双引号 (""
) 用于 SQL 中的标识符。是的,这是可能的。但是,您必须小心一点。存储过程中的 DDL 通常可以工作。在某些令人讨厌的极端情况下,您最终可能会遇到“缓存查找”错误。原因是过程基本上是语句的一部分,并且在极少数情况下动态修改这些系统对象可能会导致错误(必须如此)。但是,CREATE TABLE 不会发生这种情况。所以,你应该是安全的。