■ はじめに
「UPDATEしてレコードがなかったら、INSERTをする」ストアドを作成する
【0】準備
テーブル「person」
-- デフォルトにあるテーブルだけど CREATE TABLE person ( id character(8) NOT NULL, name character varying(100), sex character(1), updatedate timestamp without time zone, CONSTRAINT person_pkey PRIMARY KEY (id) )
【1】サンプル
updateOrInsertPerson.sql
CREATE OR REPLACE FUNCTION updateOrInsertPerson( targetId character(8), targetName character varying(100), targetSex character(1) ) RETURNS BOOLEAN AS $$ BEGIN UPDATE person SET name = targetName, sex = targetSex, updatedate = TIMESTAMP 'now' WHERE id = targetId; IF NOT found THEN BEGIN INSERT INTO person( id, name, sex, updatedate) VALUES ( targetId, targetName, targetSex, TIMESTAMP 'now'); END; END IF; RETURN TRUE; EXCEPTION WHEN unique_violation THEN RETURN FALSE; END; $$ LANGUAGE plpgsql;
1)実行例
その1
SELECT updateOrInsertPerson('X0000004', 'Mike', 'm'); SELECT id, name, sex, updatedate FROM person WHERE id = 'X0000004';
表示結果1
id name sex updatedate ----------+------+---+------------------------- "X0000004"|"Mike"|"m"|"2014-09-01 22:28:54.965"
その2
SELECT updateOrInsertPerson('X0000005', 'Mary', 'f'); SELECT id, name, sex, updatedate FROM person WHERE id = 'X0000004' OR id = 'X0000005';
表示結果2
id name sex updatedate ----------+------+---+------------------------- "X0000004"|"Mike"|"m"|"2014-09-01 22:28:54.965" "X0000005"|"Mary"|"f"|"2014-09-01 22:33:52.847"
その3
SELECT updateOrInsertPerson('X0000004', 'Ken', 'm'); SELECT id, name, sex, updatedate FROM person WHERE id = 'X0000004' OR id = 'X0000005';
表示結果3
id name sex updatedate ----------+------+---+------------------------- "X0000004"|"Ken" |"m"|"2014-09-01 22:28:54.965" "X0000005"|"Mary"|"f"|"2014-09-01 22:33:52.847"
参考文献
http://gonbee.blog.so-net.ne.jp/2007-09-16
関連記事
ストアド ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2010/08/06/112528
PostgreSQL
ストアド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/04/21/000100
ストアド ~ INSERT / UPDATEを行い、それ以外はDELETE ~
https://dk521123.hatenablog.com/entry/2014/09/03/235806