質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

6224閲覧

SQL*Loaderでのエラー(NULLは挿入できません)について

hiroflame

総合スコア11

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2018/10/26 14:51

SQL*Loaderにて下記の内容をDBに挿入しようとしています。

キー項目にスペースが入力されているデータについて、
直接insert文で挿入する際にはエラーとなりませんが、
SQL*Loaderにて挿入する場合にはエラーとなります。

どなたか、回避方法をご教授いただけないでしょうか?

【セット項目】
①会社CD : '01'
②店舗CD : ' '(スペース3桁)
③処理区分:'A'
※①、②のみキー項目

【CTLファイル】
OPTIONS( --決まり文句
--ロード対象レコード行数(「-1」を指定すると無限大)
LOAD=-1,
--スキップレコード行数
SKIP=0,
--エラー許容数(「-1」を指定すると無限大)
ERRORS=-1,
--コミットをかけるタイミング(「-1」を指定すると無限大)
ROWS=-1
)

LOAD DATA --決まり文句
--読み込むファイル
INFILE '/tmp/TargetTable_setData.csv'
--不良ファイル。ロードしようとしてはじかれたレコード
BADFILE '/tmp/TargetTable_badfile.log'
--廃棄ファイル。ロード対象として不正とみなされたレコード
DISCARDFILE '/tmp/TargetTable_discardfile.log'

--データを追加登録
APPEND
--登録先テーブルの指定
INTO TABLE TargetTable

FIELDS --決まり文句
--区切り文字の設定(カンマ(,))
TERMINATED BY ","
--囲い文字はダブルクォート(")
OPTIONALLY ENCLOSED BY "'"
--データの無い項目にNULLを入れるようになります。
TRAILING NULLCOLS

--対象レコードの指定
(
CD_KAISYA,
CD_TENPO,
KB_SYORI,
)

【エラー内容】
ROWSパラメータに使用される値が8323541から70に変更されました
レコード1: 拒否されました。- 表TargetTable,列CD_TENPOでエラーが発生しました。
ORA-01400: ("test"."TargetTable"."CD_TENPO")にはNULLは挿入できません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

②店舗CD : ' '(スペース3桁)

テーブルの定義では、可変長のVARCHAR2となっているのではないですか?

NotNull制約付きで、スペースを許容する必要があるなら(一意キーの一部であるなど)
定義は固定長のCHAR(n)とすべきです。
但し、その場合、桁の不足は空白で埋められます。

投稿2018/10/27 01:54

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroflame

2018/10/29 13:03

ご回答ありがとうございました。
guest

0

ベストアンサー

オープン系のソフトウェアは暗黙のRTRIM(右空白の削除)が実行される、つまり、空白はNULLに変換されるツールが多いです。
ユーティリティ SQL*Loader 空白の切捨て
それなのでオープン系のデータベースでは空白が意味のあるデータにはしません。

テーブル定義からNOT NULL制約を外すか、エディタでロードするデータから空白を他の文字に変換してからロードされては?

汎用機からオープン系へ移行する時、暗黙のRTRIMは注意事項のひとつとして説明しますが、ずっと汎用機しか使ってこなかったメンバーには反発してオープン系に移行することを拒否する人もいます。笑

サポート契約が有効でもOracle11gは既にパッチを提供しないバージョンです。どんなに大きなバグが発生しても新たなパッチは提供されません。Oracleのバージョンアップを検討されては?サポート契約が有効ならOracleライセンスのバージョンアップは無料です。

投稿2018/10/26 20:00

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/10/27 01:58 編集

リンク先の説明にあるように、 「空白は、データの一部として含めることも切り捨てることもできます。」 ですよ。
Orlofsky

2018/10/27 03:12

CHAR型にするって手もありますね。
sazi

2018/10/27 03:22 編集

varchar2になっていると思うので、ローダーの話ではなく、値を活かすならそれしか手は無いです。
hiroflame

2018/10/29 13:03

ご回答ありがとうございます こちらの記載が正しくありませんでした。誠に申し訳ありません。 回答いただいた内容を踏まえ、再度セットした際の情報を確認しました。 その結果、ロードする際に、暗黙のRTRIMによって、データがNULLになっていることが分かりました。 ※展開いただいたリンク先の内容より推測 スペースを囲い文字で囲うことで、問題なくデータがロードできることが確認できました。 【セット項目】 <誤った内容(以前の記載)> ①会社CD : '01' ②店舗CD : ' '(スペース3桁) ③処理区分:'A' ※①、②のみキー項目 <正しい内容> セットデータはCSVにて、下記の通り ①会社CD,②店舗CD,③処理区分 ----------------------------- 01, ,A <正しい内容(修正後=ロードに成功したデータ)> セットデータはCSVにて、下記の通り ①会社CD,②店舗CD,③処理区分 ----------------------------- 01,' ',A なお、  ②は(スペース3桁)  ①、②のみキー項目  全てCHAR型
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問