Allegro!

JavaやIT系小ネタ、趣味の話まで。

【DBflute】PostgreSQL11以降でProcedurePmbが生成できない問題【解決】

モイ!お久しぶりです。PaZooです。
皆さんお元気ですか。私はついさっきまでくたばってました。。。

何故くたばってたかって??それは表題の通りです。
それでは早速お話していきましょう。

事の発端

むかーしむかし、あるところにテスト用DBを構築したそうな。
で、突っ込んだDBはPostgreSQL12でした。
そして、作ったSP(function)はreturns table記法です。

以前6ヶ月前くらいに一度DBfluteを実行していて、成功していた実績がありました…

が!!!!!今流してみると。。

すっとこどっこいProcedurePmbが生成されないじゃない!!!何故?!!!

ひじょーーーーーーに焦りました。。
そりゃだって現場で「嘘つき」って言われるじゃん!!!
(いたもん…トトロいたもん…の気持ちでした。。)

枕を濡らして眠った夜。神様が現れて秒速解決。

現場から「どうなってんの!調べて!!」と言われ、早3日。
悔しい思いと、トトロいたもん…の気持ちを持ち合わせたぐしゃぐしゃな私。

真っ暗な部屋で一人。青い鳥で一言。

「助けてクレメンス…」

その声は某青いロボットに頼る某少年のように、製作者様へとたどり着いたらしく。。
なんとお声掛けいただきました…!!そして風のように秒速で解決。。


どうやら原因は、JDBCのバージョン(42.2.11以降)によるものらしい。

解決策は、JDBCのバージョンダウン(42.2.10)を行うこと。

具体的には、PostgreSQL11以降に現れた「ストアドプロシージャ」によってgetProcedures()はストアドプロシージャ専用のものとなったためfunctionでは取得できなかったことが背景のようです。

DBfluteJDBCを同梱してくださっている親切設計なのですが、JDBCのバージョンを変更したい場合は、DBFluteクライアントの extlib ディレクトリ にJDBCのバージョン(42.2.10)を配置してあげると実行JDBCを変更してくれます。

セットアップについては公式サイトをご覧ください!
dbflute.seasar.org


「extlibフォルダなんてないよ!!」

…なければ作ればいいじゃない!!!extlibフォルダを新しく作って、JDBCを配置してあげてください!
実行Pathをどこかのファイルに定義する必要はなく、自動で切り替えてくれます。

また、切り分けとしてストアドファンクションの構成が問題なのか調べてみました。
新しいJDBCのバージョン(42.2.11以降)では、カーソルでやってみたり色々検証しましたが、returns table記法に限らずfunctionはすべて取得できませんでした…。

「じゃあとにかく古いJDBCを指定すればええやん?!」というわけでもなく。古すぎるJDBCだと「認証型うんちゃら~サポートしてないよ!」というエラーが出ます。
これらの検証結果があり、今回は42.2.10を指定しています。

DBfluteユーザーの皆様でPostgreSQL11以降を導入する(若しくは検討している)方、バージョンアップを検討している方へ…ぜひブログ記事を見てくれ…届いてくれ…!
ちなみに、公式サイトにて今回の事象についての回避策を記載していただけるとのことでした!
また、今後はどちらもサポートしていけるように検討していただけるみたいです。

製作者様、神!!!!!

まとめ

私と同じ事象が発生した方は、解決策として挙げている内容をぜひ検証してみてください!
それと、製作者様とコンタクトできたのはみんな大好き青い鳥(Twitter)でお声掛けいただきました。

MLやSlackへの参加も行っていましたが、コミュ力ブロンズな私。
「製作者様にお声掛けするタイミングってなかなか難しいぞ…」と思い、青い鳥でつぶやいたことが今回のターニングポイントだったのかもしれません。

DBfluteで困ったときはつぶやいてみると、もしかしたらあなたの前にも神様が現れるかもしれません…!

製作者様、本当にありがとうございました!!!
twitter.com