集合演算
Oracle、PostgreSQLともに集合演算の機能があります。UNION句、INTERSECT句は両方でサポートされるので変更の必要は ありません。しかし、OracleのMINUS句は、PostgreSQLでは等価なEXCEPT句に変更する必要があります。
OracleでのMINUS句の例
SELECT 担当者ID, 担当者名
FROM 担当者マスタ
MINUS
SELECT 支店担当者ID, 支店担当者名
FROM 支店担当者マスタ
ORDER BY 1;
PostgreSQLでのEXCEPT句の例
SELECT 担当者ID, 担当者名
FROM 担当者マスタ
EXCEPT
SELECT 支店担当者ID, 支店担当者名
FROM 支店担当者マスタ
ORDER BY 1;
図11は実行結果です。
| 担当者id | | | 担当者名 |
| ---------- | + | ---------- |
| 1 | | | 鈴木 |
| 2 | | | 小野 |
| 3 | | | 斎藤 |
| 5 | | | 小林 |
| 6 | | | 伊藤 |
| 7 | | | 佐瀬 |
| 8 | | | 宇賀神 |
| (7 rows) | ||
更新のための行ロック
Oracle、PostgreSQLともに、SELECT〜FOR UPDATEによる行ロックの機能をサポートしているので変更の必要はありません。FOR UPDATE句を使って更新用に特定の行をロックすることで、現行のトランザクションが終了するまでは、ロックした行が他のトランザクションによって更新 されたり削除されたりすることがなくなります。もちろん、「SELECT〜FOR UPDATE」を実行したときに、目的とする行のロックがすでに他のトランザクションに獲得されていることもあります。そうした場合には、すでにロックを 獲得しているトランザクションの終了を待ってロックを獲得します。
Oracleには、そうした場合にロックを獲得しているトランザクションの終了を待たずに制御を戻す「NOWAITモード」があります。しかし PostgreSQLには、このNOWAITに相当する機能はありません。目的とする行のロックがすでに他のトランザクションに取られていると PostgreSQLでは必ずウェイトが発生しますので、使うときにはデッドロックにならないように注意しましょう。
パーティション表の移行
Oracleには、大きな表や索引をいくつかの「パーティション」に分けて管理できる機能があります。次の例は、売上データ表が非常に大きいために年度別にパーティショニングしている際に、4月分のみのデータを抽出するSELECT文です。
SELECT * FROM 売上データ
PARTITION (data2004)
WHERE 処理日 BETWEEN
'2004/04/01' AND '2004/04/30';
PostgreSQLには、大きな表や索引をパーティショニングして保持できる機能はありませんが、SQL文の移行に際しては、単純にPARTITION句を削除してパーティションの指定を無視することで移行が可能です。
SELECT * FROM 売上データ
WHERE 処理日 BETWEEN
'2004/04/01' AND '2004/04/30'; ![]()
ROWIDの移行
OracleのROWIDに近いものとして、PostgreSQLにはOIDが存在します。し かし、OIDは基本的に、システムテーブルのプライマリキーとしての使用を前提にしています。OIDの最大値が十分に大きくないため、ユーザテーブルにお けるプライマリキーとしての使用は推奨されていませんので注意してください。
分散問い合わせの移行
PostgreSQL本体には分散問い合わせの機能はありませんが、contrib/dblinkフォルダに同等の機能を持つdblink()関数がありますので、興味のある方は試してみるとよいでしょう。