主に、DB2のCLP(コマンド行プロセッサー)の使用方法および、DB2特有のコマンドやSQLについての情報。
より正確で詳細な情報は下記のサイトを参照してください。
IBM データベース(DB2) - Japan
データベース(DB2) マニュアル
本ページの内容は、DB2 CLPを対象としています。DB2v9.7からの新機能であるCLP Plusについての記述ではありませんのでご注意ください。CLP PlusはOracleのSQL*Plusと互換性のあるコマンド行プロセッサーです。
$ db2level
$ db2set 環境変数=値
CLPは、DB2の対話型コマンドラインインターフェースです。
$ db2
または
$ db2 [オプション]
起動時に下記のオプションを指定することができます。
オプション | 説明 | デフォルト設定 |
---|---|---|
-a | SQLCAを表示する | OFF |
-c | 自動コミット | ON |
-e | SQLCODE/SQLSTATEを表示する | OFF |
-f | 入力ファイルから読み込む | OFF |
-l | 履歴ファイルにコマンドのログをとる | OFF |
-n | 改行文字を除去する | OFF |
-o | 出力を表示する | ON |
-p | db2対話式プロンプトを表示する | ON |
-r | 出力報告をファイルに保管する | OFF |
-s | コマンドエラーで実行を停止する | OFF |
-t | ステートメント終了文字を設定する | OFF |
-v | 現行コマンドをエコーする | OFF |
-w | FETCH/SELECT警告メッセージを表示する | ON |
-x | 列見出しの印刷を抑制する | OFF |
-z | 出力ファイルにすべての出力を保管する | OFF |
例えば、-tを指定するとステートメントの終了文字が';'となります。
select count(*) from tbl_exsample;
コマンド名に続けて、ステートメントを記述して実行することもできます。
DB2プロンプトが表示されないため、quitで終了する必要がなく、shellプログラミングに便利です。
下記のコマンドは、順番に実行することによりDBに接続した後、SQLを実行して結果をファイルに格納します。
※windows環境では、db2ではなく、db2cmdかもしれません
$ db2 connect to データベース名
$ db2 set schema スキーマ名
$ db2 'select * from テーブル名' > output.txt
quit
connect to データベース名
connect to データベース名 user ユーザー名
set schema スキーマ名
?
? コマンド名
? option
? help
list command options
update command options using c off
list tables for all
select table_name from sysibm.tables
describe table テーブル名
create table 新テーブル名 like 元テーブル名
create table 新テーブル名 ( テーブル属性定義 )
drop table テーブル名
delete from テーブル名
truncate table テーブル名 immediate
import from /dev/null OF DEL REPLACE INTO テーブル名
alter table テーブル名 activate not logged initially with empty
rename table 旧テーブル名 to 新テーブル名
alter table テーブル名 add 列名 char(10) not null with default ''
altobjというストアドプロシージャを使用するか、コントロールセンターで行います。
どちらも内部では表の作り変えをおこなっているようです
select table_name from sysibm.views where table_schema = スキーマ名
create view ビュー名 [ (列名) ] as SELECT文
drop view ビュー名
select name , tbname from sysibm.sysindexes
describe indexes for table テーブル名
select name from sysibm.sysindexes where tbname = テーブル名
create unique index インデックス名 on テーブル名 ( 列名 [ , ... ] )
create index インデックス名 on テーブル名 ( 列名 [ , ... ] )
drop index インデックス名
reorg indexes all for テーブル名
select current date from sysibm.sysdummy1
select current time from sysibm.sysdummy1
select ( char(current date) || ' ' || char(current time,jis) ) as datetime from sysibm.sysdummy1
select dayofweek(current date) as week from sysibm.sysdummy1
select current date -1 days from sysibm.sysdummy1
※使用できるキーワード
year , years , month , months , day , days , hour , hours , minute , minutes , second , seconds , microsecond , microseconds
select case when year(FUGA) < year(current date) or month(FUGA) < month(current date) then '1' else '2' from HOGE
特殊レジスター | 説明 | 別名 |
---|---|---|
CURRENT DATE | 現在日付 | CURRENT_DATE |
CURRENT TIME | 現在時刻を返します | CURRENT_TIME |
CURRENT TIMESTAMP | タイム・スタンプを返します | CURRENT_TIMESTAMP |
CURRENT TIMEZONE | 世界標準時と現行サーバーでの地方時との差を指定します。地方時から CURRENT TIMEZONE を引くと、その地方時が UTC に変換されます | CURRENT_TIMEZONE |
スカラー関数 | 説明 | 使用例 |
---|---|---|
CURDATE | 現在日付を返します(CURRENT DATEと同じ) | CURDATE() |
CURTIME | 現在時刻を返します(CURRENT TIMEと同じ) | CURTIME() |
DATE | 指定された値に基づく日付を返します | DATE('1995-11-21') |
DAY | 指定した値の日の部分を返します | DAY(NOW()) |
DAYOFMONTH | 指定した値の日の部分を返します | DAYOFMONTH(NOW()) |
DAYOFWEEK | 曜日を表す 1 から 7 までの整数 (1 は日曜日を表し、7 は土曜日を表す) を返します。 | DAYOFWEEK(NOW()) |
DAYOFYEAR | 年間通算日を表す 1 から 366 までの整数 (1 は 1 月 1 日を表す) を返します。 | DAYOFYEAR(NOW()) |
DAYS | 日付の整数表現を返します | DAYS(NOW()) |
HOUR | 指定した値の時の部分を返します | HOUR(NOW()) |
MICROSECOND | 値のマイクロ秒の部分を返します | MICROSECOND(NOW()) |
MINUTE | 指定した値の分の部分を返します | MINUTE(NOW()) |
MONTH | 指定した値の月の部分を返します | MONTH(NOW()) |
NOW | タイム・スタンプを返します(CURRENT TIMESTAMPと同じ) | NOW() |
QUARTER | 日付が存在する四半期を表す 1 から 4 までの整数を返します。 | QUARTER(NOW()) |
SECOND | 指定した値の秒の部分を返します | SECOND(NOW()) |
TIME | 指定された値から時刻を返します | TIME('23:10:51') |
TIMESTAMP | 指定された 1 つの値または 2 つの一対の値からタイム・スタンプを返します | TIMESTAMP('1995-11-21', '23:10:51') |
WEEK | 年間通算週を表す 1 から 54 までの範囲の整数を返します | WEEK(NOW()) |
YEAR | 指定された値の年の部分を返します | YEAR(NOW()) |
select row_number() over() as row_num , 列名 from テーブル名
select row_number() over() as row_num , 列名 from テーブル名 order by 列名
select 項目名 from テーブル名 fetch first 10 rows only
select 項目名 from ( select row_number() over() as row_num , 列名 from テーブル名 ) as tbl1 where row_num > 10
select 項目名 from ( select row_number() over() as row_num , 列名 from テーブル名 ) as tbl1 where row_num > 10 fetch first 10 rows only
EXPORT TO エクスポート先ファイル OF データ形式
[ LOBS TO LOBデータ出力先 LOBFILE LOBデータファイル接頭辞 ]
[ MODIFIED BY オプション ]
[ MESSAGES メッセージ出力先ファイル ] SELECT文
ASC
: 区切りなしASCIIフォーマットDEL
: 区切り文字付きASCIIフォーマット。IXF
: 表の型情報なども含むバイナリー形式。WSF
: ワークシートフォーマット。Lotusで使用します。
lobsinfile
: ファイルにLOBデータのパスが含まれます。chardel
: 指定すると列を引用符(')で括ります。chardel""
: 指定すると列を二重引用符(")で括ります。codepage=コードページ
: DEL形式の際のコードページを指定します。LOBSINFILEと同時には指定できません。
※DB2プロファイル変数(DB2_LOAD_OLD_LOBFILES
)の値がOFFの場合、LOBSを含む複数のレコードを一度に扱えません。
db2setの実行権限があるならば、下記のコマンドを発行することで扱えるようになります。
$ db2set DB2_LOAD_OLD_LOBFILES=ON
$ db2 export to exp_file of del select * from tbl_exsample
$ db2 export to exp_file of del lobs to ./ lobfile explob modified by lobsinfile select * from tbl_exsample
lobデータ1000件毎に1つのファイル名が使用されるため、件数に合わせてファイル名を複数指定します。
$ db2 export to exp_file of del lobs to ./ lobfile explob1 , explob2 , explob3 modified by lobsinfile select * from tbl_exsample
IMPORT FROM インポート元ファイル OF データ形式
[ LOBS FROM LOBディレクトリ [ MODIFIED BY オプション ]
[ ALLOW WRITE ACCESS ]
[ COMMITCOUNT コミットカウント ]
[ RESTARTCOUNT リスタートカウント ]
[ MESSAGES メッセージ出力先ファイル ]
インポート方法
テーブル名
ALLOW WRITE ACCESS
INSERT INTO
: 追加INSERT_UPDATE INITO
: 追加(同一キーは上書き)REPLACE INTO
: テーブルの中身を入れ替えます。REPLACE_CREATE INTO
: テーブルの中身を入れ替えます。テーブルがない場合は作成します。CREATE INTO
: テーブルを作成して挿入します。テーブル名 [IN テーブルスペース名 [ INDEX IN インデックス用テーブルスペース名 ][ LONG IN LONGテーブルスペース名 ]]
その他の内容はエクスポート時と同じです。
$ db2 import from exp_file of del replace into tbl_exsample
$ db2 import from exp_file of del lobs from ./ modified by lobsinfile replace into tbl_exsample