Postgresql

Postgresql函式創建表

  • February 20, 2021

我想創建一個函式來創建一個具有特定結構的表,將表名的一部分作為參數傳遞,因此表名是 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 不會發生這種情況。所以,你應該是安全的。

引用自:https://dba.stackexchange.com/questions/42924