Oracle Tips!

■概要
有識者から見たら、全くショボい予感もするのですが、
一応仕事で役立ったと思われるOracleのテクニック&ツール類を公開する予定です。

■一覧

  1. 全てのテーブルに対してカウントを取得する
  2. 既に作成されたテーブルのDDLを出力する
  3. 既に作成されたテーブルのControlファイルを出力する
  4. 既に作成されたテーブルのレイアウト情報を元に、機械的データを作成しテーブルにロードする

■Tips!

1. 全てのテーブルに対してカウントを取得する

スキーマにあるテーブル全部に対してカウントを取得したい場合に使えるスクリプトです。
set serveroutput on size 1000000

DECLARE
	CURSOR c1 IS
		SELECT
			table_name
		FROM
			user_tables;
	sql_stmt  varchar2(200);
	table_cnt number(10);
BEGIN
	FOR c1_rec IN c1 LOOP
		sql_stmt := 'SELECT COUNT(*) FROM ' || c1_rec.table_name;
		EXECUTE IMMEDIATE sql_stmt INTO table_cnt;
		DBMS_OUTPUT.PUT_LINE(c1_rec.table_name || ',' || table_cnt);
	END LOOP;
END;
/

quit
[Download]:
tblcount.sql

応用すれば、全部のテーブルをトランケートとかドロップもできますね。
importユーティリティの前処理なんかでも使えるかも知れません。

2. 既に作成されたテーブルのDDLを出力する

既に作成されたテーブルから、CREATE TABLE文とCREATE INDEX文を出力するスクリプトです。
表領域やインデックスを変えたい時とか、他スキーマに同じテーブルを作る時に使えます。

■実行方法
・特定のテーブルを出力する場合
makeddl.sql [テーブル名]

・自スキーマ内の全テーブルを出力する場合
makeddl.sql ALL

[Download]: makeddl.sql

3. 既に作成されたテーブルのControlファイルを出力する

既に作成されたテーブルから、SQL*Loader用のControlファイルを出力するスクリプトです。

■実行形式
makecontrol.sql [形式] [テーブル名]
形式:
固定長ファイル: FIX
CSVファイル : CSV

■実行方法
特定のテーブルを出力する場合)
makecontrol.sql FIX [テーブル名]

自スキーマ内の全テーブルを出力する場合)
makecontrol.sql CSV ALL

[Download]: makecontrol.sql

4. 既に作成されたテーブルのレイアウト情報を元に、機械的データを作成しテーブルにロードする

既に作成されたテーブルのレイアウト情報を元に、機械的データ(abc..., 012...など)を作成し、テーブルにロードするツール群および手順です。
■実行方法(添付のHOWTO.txtと同じ)

**************************************************

		機械的データ作成ツール

**************************************************

■1.テーブルを作成する
	SQL*Plusなど
■2.設定ファイルを自動生成する(引数にテーブル名(大文字)を指定)
	makeconf.bat / makeconf.sql
■3.SQL*Loader用コントロールファイルを自動生成する(2.で生成した設定ファイルを引数に指定)
	makectl.bat / makectl.vbs
■4.データを自動生成する(2.で生成した設定ファイルと、自動生成したい件数を指定)
	makedata.bat / makedata.vbs
■5.SQL*Loaderで、データをテーブルにロードする
	SQL*Loader
■6.結果を確認する。
	SQL*Plusなど

**************************************************

■1.テーブルを作成する
SQL> create table test
  2  (
  3  col1 varchar2(1)
  4  , col2 number(1,1)
  5  , col3 date
  6  , col4 char(1)
  7  , primary key (col1)
  8  )
  9  /

表が作成されました。

SQL> desc test
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------

 COL1                                      NOT NULL VARCHAR2(1)
 COL2                                               NUMBER(1,1)
 COL3                                               DATE
 COL4                                               CHAR(1)

SQL> select count(*) from test;

  COUNT(*)
----------
         0

SQL>

■2.設定ファイルを自動生成する(引数にテーブル名(大文字)を指定)
D:\work\temp>makeconf TEST

D:\work\temp>more TEST.txt
COL1                          ,CHAR
                                                         ,         1,          ,
1

COL2                          ,NUMBER
                                                         ,         1,         1,
0

COL3                          ,DATE
                                                         ,         7,          ,
0

COL4                          ,CHAR
                                                         ,         1,          ,
0

■3.SQL*Loader用コントロールファイルを自動生成する(2.で生成した設定ファイルを引数に指定)
D:\work\temp>makectl TEST.txt > TEST.ctl

D:\work\temp>more TEST.ctl
LOAD DATA
INTO TABLE TEST
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
COL1
,COL2
,COL3
,COL4
)

■4.データを自動生成する(2.で生成した設定ファイルと、自動生成したい件数を指定)
D:\work\temp>makedata TEST.txt 10 > TEST.dat

D:\work\temp>more TEST.dat
a,.1,2006/07/29,a
b,.1,2006/07/29,a
c,.1,2006/07/29,a
d,.1,2006/07/29,a
e,.1,2006/07/29,a
f,.1,2006/07/29,a
g,.1,2006/07/29,a
h,.1,2006/07/29,a
i,.1,2006/07/29,a
j,.1,2006/07/29,a

■5.SQL*Loaderで、データをテーブルにロードする
D:\work\temp>sqlldr userid=hoge/moge control=TEST.ctl data=TEST.dat

SQL*Loader: Release 9.0.1.1.1 - Production on 土 Jul 29 20:47:58 2006

(c) Copyright 2001 Oracle Corporation.  All rights reserved.

コミット・ポイントに達しました。 - 論理レコード件数10

D:\work\temp>

■6.結果を確認する。
SQL> select count(*) from test;

  COUNT(*)
----------
        10

SQL> select * from test;

C       COL2 COL3     C
- ---------- -------- -
a         .1 06-07-29 a
b         .1 06-07-29 a
c         .1 06-07-29 a
d         .1 06-07-29 a
e         .1 06-07-29 a
f         .1 06-07-29 a
g         .1 06-07-29 a
h         .1 06-07-29 a
i         .1 06-07-29 a
j         .1 06-07-29 a

10行が選択されました。

SQL>

[Download]: makedata.zip