【Oracle to PostgreSQL】SQLは同じでも結果が違う!? 除算編

こんにちは。SCSKの丸山です。

前回、異種データベース移行の3つのステップについてお話しました。

異種DBマイグレーションはこう備える!成功へ導く3ステップとは
異種DBマイグレーションは、事前に移行のハードルを把握し、PoCを通して移行実現性を確認することが大切です。Oracle DBからAlloyDBへの移行など、Google Cloudへ移行する際にDB変更を検討中の方必見です。

その中から「仕様の壁」について、Oracle DBからPostgreSQLへの異種データベース移行を例にお話していきたいと思います。前々回お話しましたGoogle Cloud をはじめAWSへの移行など、クラウド環境へデータベース移行する際に異種DB移行を考えている方に大いに参考になる内容です!是非、ご覧ください。

まず、私達の定義する「仕様の壁」とは、仕様の差による結果不正や動作差異が発生することを意味します。

同じRDBMSでも、内部アーキテクチャや使用できるSQL句には差異があります。
その中でも、異種データベース移行を実施する中で大変なのが、同じSQL文であっても、データベースによって結果が変わってしまうケース。

この場合、SQL文としては成り立っているのでエラーは出ません。そのため、テストで初めて気づくこととなり対応が遅れたり、思わぬ改修コストが発生する可能性があります。このような「仕様の壁」については、できる限り早い段階で気づき、対応しておくことが大切です。では、SQLは同じでも結果が変わってしまうケースはどのようなものがあるのか、代表的なものをシリーズでお伝えしたいと思います。

ケース1 除算「/」

まず第1回は、除算結果です。SQL文内で除算演算子である「/」を利用する場合、Oracle DBとPostgreSQLでは内部での結果の持ち方が異なるため、注意が必要です。今回は分かりやすく、SQL文内で 10/3*3 の計算があった際の結果 について見ていきましょう。

Oracle DBの場合

除算の際に余りを保持します。そのため、結果は10となります。

SQL> SELECT 10/3*3 AS ANS FROM DUAL;
ANS
———-
10

PostgreSQLの場合

除算の際に余りを切り捨てます。そのため、結果は9となります。

# SELECT 10/3*3 AS ANS;
ans
—–
9

Oracle DB からPostgreSQLへの移行時の対応

この場合、SQL文内で解決するのは難しいため、SQL文内で除算を実施せずアプリケーション側で除算を実施するなど、Oracle DBと同じ挙動になるような対応が必要になります。このようなケースは、移行方針の検討段階で早めに対応しておきたいところですね。

では、次回もお楽しみに。次回の記事はこちらです。

タイトルとURLをコピーしました