🐘 Oracle=>Postgresに移行する際のSQL文の修正点まとめ
作成日: 2022/02/09
3
  • はじめに
  • OracleとPostgresの違い
  • Oracle⇒Postgresの主な変更点
  • 各種リンク
  • 出典元サイト

はじめに

業務でOracleからPostgresにDBを変更することになり、その際の疑問や頂いたメモをまとめてみました。

OracleSQLとPostgresSQLの違い(大まか)

  • Postgresはオープンソースのデータベースソフトウェアであり、全てのソースが公開されているため、無料で利用可能
  • ソフトウェアのライセンスの1つであるBSDライセンス🔗を採用しているため、独自に機能の追加や改良を行っても公開義務は生じない
  • PostgresSQLはMySQL(こちらも現在はOracle社が管理しています、ややこしいですね)同様、派生されたデータベースソフトウェアが多数あり
    PostgreSQL⇒EDB PostgreSQL・PowerGressなど
    MySQL⇒Maria DB・Amazon Aurora

Oracle⇒Postgresの主な変更点

(※以下の文に登場する@@@は情報漏れ防止の隠し文字です)

  • 空文字
    Oracle:NULLとして扱われるため、NVL(NVL2)で、条件が成立
    PosrgreSQL:区別されるため単純なSQL関数の置きかけでは問題が生じるケースがあり

  • 文字列の連結(連結対象のフィールドがNULLの場合)
    Oracle:空文字とみなして連結される
    PostgreSQL:NULL
    例:M. Name || '(' || M.NickName || ')'
    ↳ NameまたはNicknameがNULLなら結果はNULL

  • CONCATメソッド
    NULLを空文字として連結するので、CONCAT(M. Name, '(', M.NickName, ')')に修正

  • 暗黙の型変換
    Oracle:有効
    PosrgreSQL:厳密な型チェックが行われ適合しない場合にはSQL実行エラー
    ↳PosgreSQLでTO_XXXXXX関数で型変換する際は、必ず書式(フォーマット)を指定する必要あり

  • TO_CHAR関数(※小数点ありの数値)
    文字変換する場合は、整数値でも必ず小数点が付く
    例:to_char(10.0, 'FM99.9’) → 10.
    回避するために、pkgCom.NUM_TO_CHAR()関数を作成

  • LENGTHB関数、SUBSTRB関数
    PostgresSQLでは用意されていない為、@@@.LENGTHBおよび @@@.LEFTB関数を作成
    (現在のところ、SUBSTRBは1から開始するものしか存在しないためLEFTBのみの実装)

  • INSTR関数
    PostgresSQLでは用意されていない為、@@@.INSTR関数を作成しております。

  • LAST_DAY関数
    PostgresSQLでは用意されていない為、@@@.LAST_DAY関数を作成しております。

  • TO_XXXX関数
    PostgresSQLでは同じ型への変換は、エラーになるためTO_XXXXXメソッドを取り除く。

  • 全角->半角
    Oracle版から移行したTOSINGLEBYTE関数で変換可能

  • 半角->全角
    変換できないためpkgCom.TO_MULTI_BYTEを作成

  • SELECT DISTINCT
    PostgreSQLの場合Order By で指定した列をSELECT句に含める必要あり

// Oracle
Select Distinct PatientId From tbl@@@ Order By to_number(@@@Id)														
// Postgres
Select Distinct PatientId , to_number(PatientId, '999999999') From tbl@@@ Order By to_number(@@@Id, '9999999999')														
  • 和暦変換
    ・PostgreSQLではサポートされていないため、PPOS.ConvertDate関数を作成して対応
  • 「(*)」を使用した外部結合
    ・Oracle独自の機能の為LEFT JOINに変更

各種リンク

日本Postgresユーザ会🔗
Oracle公式の学習サイト🔗
データベースのトレンドランキング🔗


出典元サイト

アンドエンジニア🔗


2021年からプログラミング学習を開始し、未経験から受託開発企業に転職。2022年前半を目標に転職活動中です。 JavaScriptとjQueryはPFで使用経験あり。最近始めたReactを使用してアプリを作成したいと考えております。 #ENJIN