[DB2-Tips] DUAL表はどこにある?
DB2を最近たまに触るようになりました。 DB2を使用した開発はしていないですが。 適当にSQLを投げているうちに、Oracleで言うところのDUAL表は何なんだろう?と疑問に持ち調べてみました。 どうやら、同じくDUAL表は存在するらしい。 しかし、単純に下記のように投げてもエラーとなってしまう。
db2 => SELECT SYSDATE FROM DUAL SQL0204N "DB2ADMIN.DUAL" は未定義の名前です。 SQLSTATE=42704
あら、見つからない、と。 どうやら、DUAL表はSYSIBMスキーマに存在するらしい。 ちうことで、下記で再度投げてみる。
db2 => SELECT SYSDATE FROM SYSIBM.DUAL 1 ------------------- 2010-12-20-11.30.49 1 レコードが選択されました。
とれました。 また、DUAL表が追加される以前は下記のように記述していたようです。
db2 => SELECT SYSDATE FROM SYSIBM.SYSDUMMY1 1 ------------------- 2010-12-20-11.32.20 1 レコードが選択されました。
値を単純に表示したいだけであれば
VALUES SYSDATE 1 ------------------- 2010-12-20-12.58.03 1 レコードが選択されました。
とも記述できるらしい。 またVALUESの場合、下記のような書き方も可能。
db2 => VALUES 1,2,3 1 ----------- 1 2 3 3 レコードが選択されました。 db2 => VALUES (1,2,3) 1 2 3 ----------- ----------- ----------- 1 2 3 1 レコードが選択されました。 db2 => VALUES (1,2,3),(4,5,6) 1 2 3 ----------- ----------- ----------- 1 2 3 4 5 6 2 レコードが選択されました。
ただし、列別名は指定できなさそうなので、 結局はDUALもしくはSYSDUMMY1表を使うことになりそうです。 便利なのに…。 また、スキーマ名の修飾無しで実行する方法を下記に示します。
DUALをスキーマ名の修飾なしに使用する
DUAL表を修飾無しで使用する場合はOracle互換で動作させれば良いらしい。 方法は下記に記載するが、環境により正常に行えない可能性がある点にご注意頂きたい。 私の環境では正常に行うことはできず、下記のような結果となってしまいました。
C:\>db2set DB2_COMPATIBILITY_VECTOR=ORA DBI1301E 値が無効です。 説明: レジストリー変数に指定した値は無効です。 ユーザーの処置: DB2 インフォメーション・センターを参照して、レジストリー変数の有効な値 を確かめてください。
ここで、DB2_COMPATIBILITY_VECTORというレジストリー変数に値を設定しようとしている訳ですが ORAを正常に認識してくれていないようである。 わざわざすぐに別の手段を探すのは煩わしかったため、私は下記のように対応しました。
C:\>db2set DB2_COMPATIBILITY_VECTOR=2 C:\>db2stop C:\>db2start
これで、とりあえず修飾無しの SELECT SYSDATE FROM DUAL; といったSQLが発行できるようになります。
関連リンク
DB2 Version 9.7 for Linux, UNIX, and Windows DUAL 表
「DB2」に関する「本」の商品を自動的に表示しています。
キーワードに関連していない商品は、Amazonがオススメする商品です。気になる物があればどうぞ。
キーワードに関連していない商品は、Amazonがオススメする商品です。気になる物があればどうぞ。
作成日:2010年12月20日(Mon)