SlideShare une entreprise Scribd logo
1  sur  16
PL/SQLをPL/PGSQLに
した話
を同人誌にした話
目黒 聖(めぐろ・た
かし)
自己紹介
名前
 目黒聖(めぐろ・たかし)
職業
 某都内中小SI勤務
 PostgreSQL歴3年
趣味
 アニメ見ること
 漫画読むこと
 居合道
Twitter
 まぐろ @tameguro
 アイコン通りオタクです
案件
Oracle 10gからPostgreSQL 9.2への移行
既存のPL/SQLを活かしたい
そもそも移行できるのか?
移行できるとして工数はどのくらいかかるのか?
検証!!
PL/SQLをPL/PGSQLにする
PL/SQLとPL/pgSQLは何が違う?
 書き方が似ているが、似ているだけ
 PostgreSQLにはパッケージやボディという概念がない
 ファンクション間で共通する変数・関数がない
 ファンクション内でトランザクション制御ができない
 Oracle独自の機能を呼び出されているとPostgreSQLの基本機能では対応で
きない
書き方は似ているだけ
CREATE FUNCTIONも構文が違う
 RETURNではなく、RETURNS
 関数本文の扱いが文字列
データ型を書き換える
 数値型、文字列型、日付型などは、比較的単純に置き換えればよい
 TABLE型やEXCEPTION型(ユーザ定義例外)などは、単純には置き換えられな
い
 余計な処理を追加するか、諦める
PL/SQL独自の構文も書き換える
 %NOTFOUND
 よく似たFOUND変数を参照
 %ROWCOUNT
 GET DIAGNOSTIC構文を使用して、直前のSQLの結果件数を取得
パッケージとボディ
パッケージ内で共有できるグローバル変数
 変数用の一時テーブルを作成して、そこに保持すれば擬似的にグローバル変
数ができるのでは?
 わざわざファンクションのためだけにテーブルを追加するのは…
 変数の型は?異なるデータ型の変数は、全部別テーブル?
 グローバル変数はやめて、ファンクション内のローカル変数にする
 受け渡しは引数で渡す
パッケージはスキーマで代用
 スキーマにパッケージと同じ機能はないが、書き方が同じだから
パッケージに変数が定義されて、ボディには定義されていな
い場合もあるので両方とも確認
 関数のソースを読みたいがためにボディだけ見ていると、たまに痛い目を見
ます
サブプログラム
ファンクション内ファンクション、プロシージャ内ファンク
ション
 PL/pgSQLにはサブプログラムはないので、ファンクションはすべて別々の
ファンクションとして、CREATEする必要あり
 サブプログラム間で共有していた変数は、引数として渡すように変更
異なるファンクションに、同じ名前のサブプログラムがある
場合に注意
 場合によってはファンクションを統合したり分割したりしなければならず、
もとのソースから大きく変わることもある
トランザクション制御不可
PL/pgSQLではファンクション内でCOMMITまたはROLLBACK
は実行できません!!
でも、PL/SQLのバッチでは結構頻繁にやってます!!
どう対応する?
 仕様を精査して、COMMIT不要だったら削除する
 COMMITが必要な場合、そこで別ファンクションに分け、ファンクションの
呼び出し元でCOMMITする
 もともとのソースとはどんどんかけ離れた姿に
正直、PL/pgSQLで作成したファンクションでバッチ処理は向
いていない
POSTGRESQL 11では?
PostgreSQL 11でストアド・プロシージャが実装され、プロシー
ジャ内でCOMMIT/ROLLBACKができるようになりました
しかし、まだ制限が…
このプロシージャを動かすと
CREATE OR REPLACE PROCEDURE transaction_test()
AS $$
DECLARE r RECORD;
BEGIN
BEGIN
FOR r IN SELECT * FROM test2 ORDER BY x LOOP
INSERT INTO test1 (a) VALUES (r.x);
COMMIT;
END LOOP;
EXCEPTION
WHEN others THEN
RAISE NOTICE 'SQLSTATE=%,MESSAGE=%', SQLSTATE, SQLERRM;
ROLLBACK;
END;
END;
$$ LANGUAGE plpgsql;
POSTGRESQL 11では?
こうなります
EXCEPTION区が存在するブロック内では、
COMMIT/ROLLBACKができません
わりとありそうなロジックなので、ちょっと残念です
# call transaction_test();
NOTICE: SQLSTATE=2D000,MESSAGE=サブトランザクションの実行中はコミットできません
CALL
ORACLE独自の機能
たとえばDBMS_OUTPUTのような機能を一から作るのか?
Orafce
 Oracleと互換性のあるインタフェースで、Oracleの機能をPostgreSQLでも
実行できるようにする拡張機能
 すごく便利
 DBMS_OUTPUT.PUT_LINE
 UTL_FILE.GET_LINE
 ファイルの最終行まで読み込むと、NO_DATA_FOUND例外を投げるので、EXCEPTIONでCATCH
してファイル読み込みを終了させる、不思議な仕様
 ただし、PL/pgSQLでは例外を投げるとBEGIN~EXCEPTIONの処理はアボートされるので、ファイ
ルを1行ずつ読み込んで、テーブルにINSERTするような処理ではすべてが水の泡
 UTL_FILE.GET_NEXTLINE
 Oracleには存在しない、Orafce独自の関数
 最終行まで読み込むとNULLを返すので、NULL判定してEXITすれば、処理がアボートされずに済む
検証結果
相当無理すればPL/SQLをPL/pgSQLに移行可能
性能は、PL/SQLよりPL/pgSQLのほうが劣る
それなら最初から別の言語にしても同じくらいの労力では?
別のDBMSに移行するなら、今までの資産をすべては有効活用
できないことも伝える
結果的にこの案件は諸事情があって検証のみで終了してし
まったが、もしも移行を行うなら、既存のシステムに詳しい
人、Oracleに詳しい人、PostgreSQLに詳しい人が絶対に必要
 孤軍奮闘して疲れ果てました…
話は変わりますが
オタクなので同人誌を買いに行くこともあります
技術書典という、技術系同人誌のみの即売会に
行ったのですが、RDBMSについての同人誌はほと
んどありませんでした
 ネットで探す情報は断片的なものが多く、体系的ではない印
象
 本を読んで勉強したい
 自分が知りたいことが書いてあるPostgreSQLの本がない
なければ自分で作ればいいじゃない
 ちょうど技術書典でいい本が…
 「Re:VIEW」という書籍執筆支援ツールで、テキストを書い
てビルドすればいい感じのPDFを出力してくれるすぐれもの
の紹介
意外に作れるものです
私は残念ながらオタクで、そして、友人もオタクです
同人誌を出している友人も多数います
やり方は教えてもらえる
 印刷所を紹介してもらえたのは非常にラッキーでした
というわけで作りました
• 2017年12月29日の冬コ
ミで初めて頒布
• 30部(+予備10部)作成し、
なんと完売!!
• その後再版の希望の声があ
り、調子に乗って100部再
版
• まだまだ在庫あります!
同人誌というアウトプット
ブログ等、ネットでのアウトプットのほうが、無料でいつで
も気軽にできますし、広範囲に公開できますが、直接反応を
もらえるのはやはり貴重
なにより自分で作ったものが形になってそこにあるというの
は代えがたい感慨がある
皆さんの知識と経験を本にして読みたい
一度、やってみましょう!!
いえ、やってください!!

Contenu connexe

Tendances

SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSNoriyoshi Shinoda
 
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...NTT DATA Technology & Innovation
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...NTT DATA Technology & Innovation
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)Hironobu Suzuki
 
PostgreSQL監査
PostgreSQL監査PostgreSQL監査
PostgreSQL監査Ayumi Ishii
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報Masahiko Sawada
 
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Dbts2013 特濃jpoug log_file_sync
Dbts2013 特濃jpoug log_file_syncDbts2013 特濃jpoug log_file_sync
Dbts2013 特濃jpoug log_file_syncKoji Shinkubo
 
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)NTT DATA Technology & Innovation
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)NTT DATA Technology & Innovation
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南Mikiya Okuno
 

Tendances (20)

SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
 
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
 
PostgreSQL監査
PostgreSQL監査PostgreSQL監査
PostgreSQL監査
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
 
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Dbts2013 特濃jpoug log_file_sync
Dbts2013 特濃jpoug log_file_syncDbts2013 特濃jpoug log_file_sync
Dbts2013 特濃jpoug log_file_sync
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
 
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 

PL/SQLをPL/pgSQLにした話を同人誌にした話