テーブル名が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 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$ LANGUAGE plpgsql;
_
format()
を_%I
_とともに使用して、テーブル名をサニタイズし、SQLインジェクションを回避しています。 PostgreSQL 9.1以降が必要です。
データには必ず一重引用符(_''
_)を使用してください。二重引用符(_""
_)は、SQLの識別子です。
はい、これは可能です。ただし、少し注意する必要があります。ストアドプロシージャのDDLは通常機能します。いくつかの厄介なケースでは、「キャッシュルックアップ」エラーが発生する可能性があります。その理由は、プロシージャは基本的にステートメントの一部であり、そのようなシステムオブジェクトをオンザフライで変更すると、まれにまれなケースでエラーが発生する可能性があるためです。ただし、これはCREATE TABLEでは発生しません。だから、あなたは安全でなければなりません。