Sql*Loaderを使用してCSVファイルを取り込む際に、取り込むCSVデータが5桁以上の場合はエラーとしたいのですが。
制御ファイルにどのような記述をすればよいかわかりません。どうか、ご教授お願いいたします。
ちなみに 5桁未満の場合は、0埋めを行っております。

具体的には、以下のような結果を出したいのですが。
○ 1   ⇒ 00001(0埋めして取り込む)
○ 00001 ⇒ 00001(取り込む)
○ 00000 ⇒ 00000(取り込む)
× 000001 ⇒ (取り込まない)
-------------------------------------------------------------
現状、以下のソースだと「1234567」のCSVデータをロードすると、
「34567」で取り込まれてしまいます。(エラー発生しない。)

【Sql*Loaderの制御ファイル】
LOAD DATA
  (省略)
TRUNCATE
TRAILING NULLCOLS
(
No_colum "LPAD(:No_colum,5,'0')"
,
No2_colum "LPAD(:No2_colum,5,'0')"
)

【tmp_tableの情報】
カラム:No_colum vchar2(サイズ:5)
カラム:No2_colum vchar2(サイズ:5)
-------------------------------------------------------------

どうか、ご教授よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

制御ファイルのWHEN句では < というオペレータは使えないようですね。


フィールドリストでCASE式を使ってはどうでしょうか。
No_colum "CASE WHEN LENGTH(:No_colum) < 5 THEN LPAD(:No_colum,5,'0') ELSE :No_colum END"
という感じです。
桁数オーバーになるレコードはエラーになるので取込まれないと思います。
    • good
    • 3

LOAD DATA


INTO TABLE XXX
WHEN No_colum < "000000" AND No2_colum < "000000"
  (省略)
TRUNCATE
TRAILING NULLCOLS
(
No_colum "LPAD(:No_colum,5,'0')"
,
No2_colum "LPAD(:No2_colum,5,'0')"
)
でどうでしょう。

この回答への補足

ご回答ありがとうございます。
上記のSQLを実行した結果、エラーが発生します。

SQL*Loader-350: 行8に構文エラーがあります。
英数字以外の無効な文字列があります
WHEN No_colum < "000000" AND No2_colum < "000000"

補足日時:2011/04/13 09:25
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQL*Loaderで、データを加工してロードしたいです。

SQL*Loaderを使ってデータをテーブルにロードしたいのですが、その際に、データを加工してロードしたいと考えております。

◎使用するコントロールファイルのサンプル
(項目1)(項目2)(項目3)
12345, abcde, ABCDE

◎使用するコントロールファイルのサンプル
Load Data
truncate
Into Table "Sample"
Fields terminated by ','
Optionally enclosed by '"'
(
 項目1,
 項目2,
 項目3,
 項目4 EXPRESSION ":項目1(の下1桁)|| ' ' || :項目2(の下2桁)|| ' ' || :項目3(の下3桁)"
)

まず、項目4には、項目1~3のデータを連結したものをロードしたいと考えております。
その際に、

項目4(6桁)="項目1の下1桁"+"項目2の下2桁"+"項目3の下3桁"

となるようにしたいのですが、どのような関数を使ったらよいのでしょうか?

また、連結する関数"EXPRESSION"とどのように組み合わせたらよいのか教えていただけないでしょうか?


思い当たる様々なキーワードでググってみたのですが、参考になるページを見つけることができませんでした。
「ヒントやるから自分で調べろ」みたいなお返事でも結構ですので、アドバイスをいただけますようお願い申し上げます。

SQL*Loaderを使ってデータをテーブルにロードしたいのですが、その際に、データを加工してロードしたいと考えております。

◎使用するコントロールファイルのサンプル
(項目1)(項目2)(項目3)
12345, abcde, ABCDE

◎使用するコントロールファイルのサンプル
Load Data
truncate
Into Table "Sample"
Fields terminated by ','
Optionally enclosed by '"'
(
 項目1,
 項目2,
 項目3,
 項目4 EXPRESSION ":項目1(の下1桁)|| ' ' || :項目2(の下2桁)|| ' ' || :項目3(の下3桁)"
)

まず、...続きを読む

Aベストアンサー

#1です。すいません、訂正です。

項目4 EXPRESSION "SUBSTR(:項目1,-1,1)|| ' ' || SUBSTR(:項目2,-1,2)|| ' ' || SUBSTR(:項目3,-1,3)"

QSQL*LoaderでCSVから指定した列のみインポートしたい。

SQL*Loaderを用いてOracleのテーブルにデータを格納
しようと思っています。
格納するデータはカンマ区切りのCSVファイルです。

入力CSVファイルは他テーブル用のファイルなので、
ローダーで落とし込むテーブルとは列数が異なります。

ですので、「CSVの5列目の値をテーブルのAA_NOというフィールドに
格納する。ということが可能なのでしょうか?」

CSVファイルのある行が
a,b,c,d,e,f
というデータの場合、テーブルには
a,e,f
とインポートしたいのです。

よろしくお願いします。

Aベストアンサー

さきほど回答しましたhamu1です。
訂正します。
a,b,c,d,e,f
というデータの場合、テーブルには
a,e,f
をインポートするときには、

(略)
(
a,
"b" filler,
"c" filler,
"d" filler,
e,
f
)

となります。
間違えちゃって、、すいません。

QSQL*Loaderでのsysdate使用

SQL*Loaderを使用してデータロードする際に、「更新日時」項目にsysdateでシステム日付を返すようにしているのですが、更新日時がTIMSTAMP型の場合に時間まで設定されません。
時間まで設定するにはどのように指定したらよいでしょうか?よろしくお願いします。

Aベストアンサー

なるほどDATE型だと時分秒は入りますがTIMSTAMP型の場合は自動で入らないのですね。
下記のようにすれば大丈夫なようです。

HOGE_TEST1.sql
--
CREATE TABLE HOGE_TEST1
( KEY1 CHAR(10) NOT NULL,
DATE1 TIMESTAMP(6) NOT NULL
)
--

HOGE_TEST1.ctl
--
LOAD DATA
INFILE 'HOGE_TEST1.dat'
APPEND
INTO TABLE HOGE_TEST1
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
"KEY1",
"DATE1" DATE 'yyyy/MM/dd hh24:mi:ss' "to_char(SYSDATE,'yyyy/MM/dd hh24:mi:ss')"
)
--

HOGE_TEST1.dat
--
"AAAAA"
"BBBBB"
"CCCCC"
--

あとはsqlldrコマンドを発行
sqlldr USER/PASS control=HOGE_TEST1.ctl
試してみて下さい

なるほどDATE型だと時分秒は入りますがTIMSTAMP型の場合は自動で入らないのですね。
下記のようにすれば大丈夫なようです。

HOGE_TEST1.sql
--
CREATE TABLE HOGE_TEST1
( KEY1 CHAR(10) NOT NULL,
DATE1 TIMESTAMP(6) NOT NULL
)
--

HOGE_TEST1.ctl
--
LOAD DATA
INFILE 'HOGE_TEST1.dat'
APPEND
INTO TABLE HOGE_TEST1
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
"KEY1",
"DATE1" DATE 'yyyy/MM/dd hh24:mi:ss' "to_char(SYSDATE,'yyyy...続きを読む

QSQL*Loader Append

SQL*Loaderのコントロールファイル内のパラメータ設定についてですが、
ネットで調べた結果
ロード方法をAPPENDとすると既存データがある場合は新しい行として追加とあるのですが、
これはテーブルのPKが重複していても新しく行がついかされるということでしょうか?

逆にREPLACEはPKが重複しているデータに上書きされるということでしょうか?

よろしくお願いいたします。

Aベストアンサー

■APPENDで主キー重複が起きるか?
ダイレクトパスロードか否かで、結果が変わります。

LoaderのオプションがDIRECT = TRUE、かつダイレクトモード可能な条件を満たしている場合、ダイレクトパスロードとになります(素晴らしく速い)が、APPENDモードで主キー重複のレコードができてしまいます。

主キーが重複した場合、主キー制約/インデックスが無効状態になっており、INSERT/DELETE/主キーのUPDATEがエラーになってしまいますので、ご注意ください。
その場合は、TRUNCATE TABLEでいったんデータを消してしまえば、復活できます。

ダイレクトパスロードでない場合のAPPENDモードでは、主キー重複はエラーではじかれます。

■REPLACEの動き
PKが重複するものの入れ替えではなく、まるっと削除してからの追加になります。
TRUNCATEとの違いは、途中でエラーが発生したときにレコードが削除する前の状態に戻る点です。
レコードが消えて良いならTRUNCATEモードのほうが速いですね

QSQL*Loaderでのゼロ埋め

SQL*Loaderでデータを取り込む際に、対象データの左桁をゼロ埋めにする方法を教えてください。

例えば、取り込み対象の項目が、5桁未満の場合はゼロ埋めを行う。
・取り込み対象:111
・ゼロ埋め後の結果:00111(この値を取り込む)

上記を実装する方法が分からず困っております。

SQL*Loaderは初めて使用するため、調べる方法も見つけられませんでした。
何か良い方法がありましたら、お教え願えないでしょうか。
また、上記を実装するための参考になるサイト等を教えていただけないでしょうか。

よろしく御願い致します。

Aベストアンサー

左に文字列を追加するLPAD関数があります。
http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/functions095.htm#sthref1253

SQL*Loaderの制御ファイルのフィールドリストでは関数を使用することができます。
http://download.oracle.com/docs/cd/E16338_01/server.112/b56303/ldr_field_list.htm#i1008150

ですので、
項目名 "LPAD(:項目名,5,'0')"
と記述すればいいです。

QSQL Loaderを使いたい

Oracleのバージョンは8、自分のPCには Oracle8Client(Application User) がインストールされています。

見よう見まねで制御ファイルを記述し、バッチファイルを作成したところ、
( sqlldr USERNAME/PASSWORD@SID control= test.ctl )

コマンドプロンプトには以下のように表示されました。

「C:\SQL>sqlldr USERNAME/PASSWORD@SID control = test.ctl
'sqlldr' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。」

実行できない原因はどこにあるか教えてください。

1.そもそもSQL Loaderを利用できる環境になっていない
(そのままでは使えなくて何かしら設定が必要とか)

2.コマンドがまちがっている
(test.ctlのパスを記述しないとだめとか、SIDは要らないだとか)

3.制御ファイルがまちがっている

どの可能性が一番高いでしょうか?

Aベストアンサー

Oracle8Client(Application User)だと
SQL Loaderはインストールされないのではないでしょうか?
Clientのインストール時に選択肢があって、
管理者用(正確な名称は覚えていない)でインストールする必要があったと思います。

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報