SQL*Plus で ORACLE DB からデータを抽出する際のお作法

 基幹データベースが Oracle DB の場合,最も基本的なデータ抽出方法の一つに SQL*Plus がある.SI Object Browser などもあるが基本有償で,個人で購入するには少し敷居が高い.

 SQL*Plus でどこまでできるかは勉強中のため未知数だが,あらかじめ .sql ファイルを作っておいて実行するなら心理的な障壁も下がる.

Windows メニューから検索して起動

 Oracle DB が稼働中のネットワークならすでに SQL*Plus がインストール済みのはずである.Windows メニューから検索して起動する.

ログイン

 ID とパスワードを入力してログインするとプロンプトが SQL> と変化する.

@ をつけてファイルを実行

 ここにクエリをタイプしていっても良いのであるが,下記のように先頭に @ をつけてファイルパスを指定すると,ファイル内に記述したクエリを実行できる.

@C:\Sample.SQL;

 上記は C ドライブ直下の Sample.SQL ファイルを指定している.拡張子は .txt でも構わない.

SQL ファイル記述のお作法

ファイルに保存

 データベースに接続する場合,主な目的はデータ抽出のはずだ.だから .txt ファイルか .csv ファイルに抽出結果を保存したいはずである.その場合,ファイルの先頭と末尾にこう書く.

spool c:\File.txt;

spool off;

レコードが途中で改行される

 1行あたりの文字数を最大値 32767 に設定する.

SET LINESIZE 32767;

 他に,実際にデータ中に改行コードが混入していることもある.その場合は SELECT 句で NULL に置換する.

 CHR(10) および CHR(13) は ASCII 配列でいうところのラインフィードおよびキャリッジリターンである.

SELECT
REPLACE(REPLACE(Column1,CHR(13),Null),CHR(10),Null) AS Column1
FROM    Table

5レコードごとに改ページが入る

 1ページあたりのレコード数を最大値に設定する.

SET PAGESIZE 50000;

末尾に余計なスペースがついてくる

 下記のように記述する.

SET TRIMSPOOL ON;

列の区切りをコンマにしたい

 デフォルトでは半角スペースであることが多い.固定データ長ならまだ検索置換で対応できるが,できれば抽出の段階できれいにしておきたい.その場合出力先を .csv ファイルにしても良い.

SET COLSEP ',';

上記をまとめると…

 下記のようになる.6 行目に実際のクエリを記述する.

SET LINESIZE 32767;
SET PAGESIZE 50000;
SET TRIMSPOOL ON;
SET COLSEP ','
spool c:\FILE.csv;

spool off;

列の途中にスペースが入る…

 ひと手間増えるがテキストエディタの検索置換で除去するのが早い.件数が数万件を超えてくると MS Office 系の重量級ソフトはメモリがオーバーフローする.

MS Wordで巨大すぎるファイルを開こうとしてオーバーフロー
MS Wordで巨大すぎるファイルを開こうとしてオーバーフロー

 抽出の時点で何とかしたいなら,SELECT 句でパイプを使用する.列名が変なことになるが,後で加工する他ないだろう.

SELECT  Column1||','||Column2
FROM    Table;

Oracle SQL Developer という手も

 SQL*Plus には制約が多い.コマンドラインが苦手である人もいるだろう.グラフィカルユーザーインターフェースでないと不都合,という向きには Oracle SQL Developer という手段もある.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください