そもそもOracleをあんまり使ったことがない
今現在を表したい
-- Oracle
SYSDATE;
SYSTIMESTAMP;
-- PostgreSQL
CURRENT_DATE;
CURRENT_TIMESTAMP;
/*
* SYSDATE >> current_date
*/
-- Oracle
select sysdate from dual;
-- PostgreSQL
select current_date;
文字列を結合したい(連結演算子というもの)
-- Oracle:連結演算子
SELECT 'Name is ' || last_name FROM employees ORDER BY last_name;
-- PostgreSQL:連結演算子というかは不明だが同じものがある
SELECT 'Name is ' || last_name FROM employees ORDER BY last_name;
関数
/*
* DECODE >>> CASE
*/
-- Oracle
DECODE('判定する値', 1, '1だった時の値', 2, '2だった時の値', '1でも2でもない場合')
-- Postgresql:DECODE関数は違う意味の関数としてPostgeSQLにもあるので注意
CASE '判定する値' WHEN 1 THEN '1だった時の値' WHEN 2 THEN '2だった時の値' ELSE '1でも2でもない場合' END
/*
* NVL >>> COALESCE
*/
-- Oracle
NVL('nullかもしれない値', 'nullだった時の値')
NVL2('nullかもしれない値', 'nullじゃなかった時の値', 'nullだった時の値')
-- Postgresql
COALESCE('nullかもしれない値', 'nullだった時の値')
明示的な行ロック
/*
* PstgreSQL
*/
-- トランザクションが終わるまで、他のトランザクションがロック、変更、削除できない
SELECT 〜 WHERE ... FOR UPDATE;
-- 同じ行のロックを獲得しようとするSELECT FOR KEY SHAREコマンドをブロックしないFOR UPDATE
SELECT 〜 WHERE ... FOR NO KEY UPDATE;
-- 排他ロックではなく共有ロックを獲得する
SELECT 〜 WHERE ... FOR SHARE;
-- SELECT FOR UPDATEはブロックされるが、SELECT FOR NO KEY UPDATEはブロックされないFOR SHARE
SELECT 〜 WHERE ... FOR KEY SHARE;
/*
* Oracle
*/
-- SELECT対象の全ての表のレコードをロック
SELECT 〜 WHERE ... FOR UPDATE;
-- 表を結合する場合に使用。行ロックする表を指定
SELECT 〜 WHERE ... FOR UPDATE OF 行ロックする表.列名 [,column_name2...];
-- 対象レコードにロックがかかっていた時に、ロックが開放されるまで待つ
SELECT 〜 WHERE ... FOR UPDATE WAIT [待ち時間]
-- 対象レコードにロックがかかっていた時に、開放を待たずに下記エラーで復帰
SELECT 〜 WHERE ... FOR UPDATE NOWAIT;