PostgreSQLとOracleによるデータベース相互移行マニュアル 6

SQL文の移行(3)

集合演算   Oracle、PostgreSQLともに集合演算の機能があります。UNION句、INTERSECT句は両方でサポートされるので変更の必要は ありません。しかし、OracleのMINUS句は、PostgreSQLでは等価なEXCEPT句に変更する必要があります。OracleでのMINU

奥畑 裕樹

2005年11月11日 20:00

集合演算

   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 |  担当者名
---------- + ----------
|  鈴木
|  小野
|  斎藤
|  小林
|  伊藤
|  佐瀬
|  宇賀神
(7 rows)
図11:EXCEPT句の実行結果

 

更新のための行ロック

   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()関数がありますので、興味のある方は試してみるとよいでしょう。

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る