shiden.com



shiden.com blog


PostgreSQLで大量データを投入する

PostgreSQLで大量データを投入。やり方のメモ。

まずはPL/pgSQLを使用可能にする。こいつはDBの設定になるので初回だけシェルで次のコマンドを投入。

> createlang plpgsql <必要ならスキーマ名>

で,PLpg/SQLを使用可能にしたら,データ投入用のスクリプトを書く。次のような感じでループで回すものを書けばよい。

DROP FUNCTION FUNC();CREATE FUNCTION FUNC(NUM INTEGER) RETURNS INTEGER AS 'DECLARE CNT INTEGER;DECLARE SQL TEXT;BEGIN    CNT := 0;    WHILE CNT < NUM LOOP        SQL := ''<<INSERT INTO ...>>'';        EXECUTE SQL;        CNT := CNT + 1;    END LOOP;    RETURN CNT;END;' LANGUAGE 'plpgsql';SELECT FUNC(1000000);

見ての通りいちいちストアド登録して実行する。ストアド中に書くSQLはシングルクオートのエスケープが......といろいろ手間。

まぁ,ともかくできたらpsql等のフロントエンドで実行してやればよい。

ちなみに余談だが作ったデータをループで削除する場合はこんな感じ。

CREATE FUNCTION SHION.F_WORK() RETURNS INTEGER AS 'DECLARE CNT INTEGER;DECLARE ENTRY RECORD;DECLARE SQL TEXT;BEGIN    CNT := 0;    FOR ENTRY IN <<SELECT ..>> LOOP        SQL := <<''DELETE ..''>>;        EXECUTE SQL;        CNT := CNT + 1;    END LOOP;    RETURN CNT;END;' LANGUAGE 'plpgsql';SELECT SHION.F_WORK();

以上まずはメモ。あとでまともに書くこと。


追記
4/10 PLpg/SQLをPL/pgSQLに誤記を修正。

トラックバック(0件)

このブログ記事を参照しているブログ一覧: PostgreSQLで大量データを投入する

このブログ記事に対するトラックバックURL: http://shiden.com/mt/mt-trackback-shiden.cgi/191

コメント(1)

MySQLのストアドはできたものの
PostgreSQLのストアドはさっぱり...
大変参考になりました!
// s_id=1,2,3の順に連番で500レコードずつ作製
CREATE OR REPLACE FUNCTION CREATE_REC(NUM INTEGER) RETURNS INTEGER AS '
DECLARE CNT INTEGER;
DECLARE SQL TEXT;
BEGIN
CNT := 1;
WHILE CNT < NUM LOOP
INSERT INTO records (id, s_id) VALUES(CNT, 1);
CNT := CNT + 1;
END LOOP;
RETURN CNT;
END;
' LANGUAGE 'plpgsql';
SELECT CREATE_REC(501);
CREATE OR REPLACE FUNCTION CREATE_REC(NUM INTEGER) RETURNS INTEGER AS '
DECLARE CNT INTEGER;
DECLARE SQL TEXT;
BEGIN
CNT := 1;
WHILE CNT < NUM LOOP
INSERT INTO records (id, s_id) VALUES(CNT, 2);
CNT := CNT + 1;
END LOOP;
RETURN CNT;
END;
' LANGUAGE 'plpgsql';
SELECT CREATE_REC(501);
CREATE OR REPLACE FUNCTION CREATE_REC(NUM INTEGER) RETURNS INTEGER AS '
DECLARE CNT INTEGER;
DECLARE SQL TEXT;
BEGIN
CNT := 1;
WHILE CNT < NUM LOOP
INSERT INTO records (id, s_id) VALUES(CNT, 3);
CNT := CNT + 1;
END LOOP;
RETURN CNT;
END;
' LANGUAGE 'plpgsql';
SELECT CREATE_REC(501);

コメントする


画像の中に見える文字を入力してください。