web-dev-qa-db-ja.com

テーブルを作成する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');

出来ますか?

9
Alan Cor

答えははいです。 :)

_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の識別子です。

18

はい、これは可能です。ただし、少し注意する必要があります。ストアドプロシージャのDDLは通常機能します。いくつかの厄介なケースでは、「キャッシュルックアップ」エラーが発生する可能性があります。その理由は、プロシージャは基本的にステートメントの一部であり、そのようなシステムオブジェクトをオンザフライで変更すると、まれにまれなケースでエラーが発生する可能性があるためです。ただし、これはCREATE TABLEでは発生しません。だから、あなたは安全でなければなりません。