SlideShare ist ein Scribd-Unternehmen logo
1 von 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部再
版
• まだまだ在庫あります!
同人誌というアウトプット
ブログ等、ネットでのアウトプットのほうが、無料でいつで
も気軽にできますし、広範囲に公開できますが、直接反応を
もらえるのはやはり貴重
なにより自分で作ったものが形になってそこにあるというの
は代えがたい感慨がある
皆さんの知識と経験を本にして読みたい
一度、やってみましょう!!
いえ、やってください!!

Weitere ähnliche Inhalte

Was ist angesagt?

SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方歩 柴田
 
GKE multi-cluster Ingress
GKE multi-cluster IngressGKE multi-cluster Ingress
GKE multi-cluster IngressKiyoshi Fukuda
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
まじめに!できる!LT
まじめに!できる!LT まじめに!できる!LT
まじめに!できる!LT Akabane Hiroyuki
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウトMasahiko Sawada
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxShota Shinogi
 
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)NTT DATA Technology & Innovation
 
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外Takuya Sato
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...NTT DATA Technology & Innovation
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
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
 

Was ist angesagt? (20)

SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
 
GKE multi-cluster Ingress
GKE multi-cluster IngressGKE multi-cluster Ingress
GKE multi-cluster Ingress
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
まじめに!できる!LT
まじめに!できる!LT まじめに!できる!LT
まじめに!できる!LT
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウト
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
 

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