我三流

いろいろ自分なりにやってみたことを書いています

PostgreSQL 動的カラム ストアドファンクション

このところストアドファンクションで動的カラムに対応すべく格闘中。

n_idは、グループの管理id
s_idは、グループ毎のid
sectorは、区間名

下記、トリガーはsectorが1件入力される毎に
s_idに自動採番するトリガー関数。

CREATE TABLE sector
(
  id serial NOT NULL,
  s_id integer,
  sector character(6),
  n_id integer,
  f_id integer,
  CONSTRAINT sector_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE sector OWNER TO yu2admin;

CREATE TRIGGER s_id_insert
  BEFORE INSERT
  ON sector
  FOR EACH ROW
  EXECUTE PROCEDURE assign_s_id(E'\\x5c7800');
テーブルsector

 id  s_id  sector n_id  f_id 
------------------------------
 25     1     4P    11     1
 26     2     9P    11     1
 27     3     GP    11     1

上記、テーブルsectorのn_id毎にグルーピングされた
sectorフィールド分のカラムを動的に生成するストアドファンクションがこれ↓

/* 縦持ちフィールドデータを利用して、横持カラムにするストアドファンクション */
CREATE OR REPLACE FUNCTION var_col_function(key integer) RETURNS text AS $$
DECLARE
    var_col text;
BEGIN
     SELECT array_to_string(array_agg('S' || sector), ', ') INTO var_col FROM sector WHERE n_id = key;
     RETURN var_col;
END;
$$ LANGUAGE plpgsql;
/* 一時テーブルを作成するストアドファンクション */
CREATE OR REPLACE FUNCTION create_tmp_records1(var_col text) RETURNS VOID AS $$
BEGIN
 EXECUTE 'CREATE TEMP TABLE tmp_records1 (id integer, '
      || var_col
      || ', n_id integer, PRIMARY KEY (id)) ON COMMIT DROP;';
END;
$$ LANGUAGE plpgsql;
/* ストアドファンクションの実行 */
SELECT create_tmp_records1(var_col_function('11'));
/* 実行結果 */
1 row;
 id, S4P, S9P, SGP