脱Oracleに向けて
OracleからPostgresqlに移行する際に
基本的に一括で直さなければいけない部分
(プロシージャなどはおいおい)
を備忘録的にまとめておく
1データ型の差異
CHAR、NCHARはすべてCHAR型になり、
VARCHAR2、NVARCHAR2すべてVARCHAR型となる。
LONG、CLOB、NCLOBはすべてTEXT型として扱う。
Postgresqlのto_char関数は戻り値がtext型となっているため、
インデックスが参照されないため要注意となっている。
数値型に関しては
OracleでいうNUMBER型が存在しないため、
用途に合わせて型を決める必要がある。
(雑にNUMERICにしがち)
OracleのDATE型はPostgresqlのDATE型、TIMESTAMP型と互換があり、
TIMESTAMP型はTIMESTAMP型とのみ互換がある。
Oracleで文字列や数値で日付を4桁や8桁などで扱っていた場合、
To_charでの型変換などに巻き込まれてしまうため、
データ移行の際にあらかじめDATE型としてデータを移行するのが
いいのかもしれない
ちなみにOracleのバイナリ型はPostgresqlでは
すべてBYTEAとなる
2よく使う構文の差異
疑似列
OracleではROWNUMで取得した表に対して連番を自動で振ってくれていたので
SELECT
*
FROM
XXXX
WHERE
ROWNUM <= 10
で先頭10件の取得ができていたが、
Postgresqlではrow_number()やLIMITなどで再現する。
SELECT
XXXX.*,
(SELECT row_number() OVER(ORDER BY AAA) AS rownum
FROM
XXXX
WHERE
rownum <= 10
-------------------------------------
SELECT
*
FROM
XXXX
ORDER BY
AAA
LIMIT 10
OFFSET 10
のようなsqlで再現する。
疑似列は移行の際に要注意となる
重複の削除
UNIQUE は DISTINCTに置き換える必要がある
もともとDISTINCTを使用している場合は置き換える必要はなし
SELECT DISTINCT * FROM XXXX
結合
Oracleで外部結合演算子(+)を使用している場合は
それぞれOUTER JOIN句に変換する必要がある
DECODE句
OracleのDECODE句は存在しないため
--oracle
SLECT DECODE(code, 1, 'AAA',
2, 'BBB',
3, 'CCC',
NULL)
FROM
XXXX
--Postgresql
SLECT
CASE WHEN code = 1 THEN 'AAA'
WHEN code = 2 THEN 'BBB'
WHEN code = 3 THEN 'CCC'
ELSE NULL
FROM
XXXX
SLECT
CASE code
WHEN 1 THEN 'AAA'
WHEN 2 THEN 'BBB'
WHEN 3 THEN 'CCC'
ELSE NULL
FROM
XXXX
のような書き換えが必要になるため注意
NVL
NVL は COALESCE へ書き換える必要がある。
使い方はNVLと変わらない。
時刻関数
OracleのTO_DATEはPostgresqlにも存在するが、
時刻を切り捨てて日付のみで変換をしてしまう。
時刻まで必要な場合はTO_TIMESTAMP
日付のみでいい場合はTO_DATEと
状況に応じて使い分ける必要がある。