Postgresql
Postgresql函式創建表
我想創建一個函式來創建一個具有特定結構的表,將表名的一部分作為參數傳遞,因此表名是 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');
可能嗎?
答案是肯定的。:)
CREATE OR REPLACE FUNCTION create_table_type1(t_name varchar(30)) RETURNS VOID LANGUAGE plpgsql AS $func$ BEGIN EXECUTE format(' CREATE TABLE IF NOT EXISTS %I ( id serial PRIMARY KEY, customerid int, daterecorded date, value double precision )', 't_' || t_name); END $func$;
我使用
format()
with%I
來清理表名並避免 SQL 注入。需要 PostgreSQL 9.1 或更高版本。請務必使用單引號(
''
) 表示數據。雙引號 (""
) 用於 SQL 中的標識符。
是的,這是可能的。但是,您必須小心一點。儲存過程中的 DDL 通常可以工作。在某些令人討厭的極端情況下,您最終可能會遇到“記憶體查找”錯誤。原因是過程基本上是語句的一部分,動態修改這些系統對像在極少數情況下會導致錯誤(必須如此)。但是,CREATE TABLE 不會發生這種情況。所以,你應該是安全的。