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

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

ただいまの
回答率

90.51%

  • SQL

    3010questions

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

  • Oracle Database 11g

    219questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 782

hiroflame

score 3

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は挿入できません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/27 10:58 編集

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

    キャンセル

  • 2018/10/27 12:12

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

    キャンセル

  • 2018/10/27 12:18 編集

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

    キャンセル

  • 2018/10/29 22:03

    ご回答ありがとうございます

    こちらの記載が正しくありませんでした。誠に申し訳ありません。

    回答いただいた内容を踏まえ、再度セットした際の情報を確認しました。
    その結果、ロードする際に、暗黙のRTRIMによって、データがNULLになっていることが分かりました。
    ※展開いただいたリンク先の内容より推測
    スペースを囲い文字で囲うことで、問題なくデータがロードできることが確認できました。



    【セット項目】
    <誤った内容(以前の記載)>
    ①会社CD : '01'
    ②店舗CD : ' '(スペース3桁)
    ③処理区分:'A'
    ※①、②のみキー項目

    <正しい内容>
    セットデータはCSVにて、下記の通り
    ①会社CD,②店舗CD,③処理区分
    -----------------------------
    01, ,A



    <正しい内容(修正後=ロードに成功したデータ)>
    セットデータはCSVにて、下記の通り
    ①会社CD,②店舗CD,③処理区分
    -----------------------------
    01,' ',A



    なお、
     ②は(スペース3桁)
     ①、②のみキー項目
     全てCHAR型

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/29 22:03

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

    キャンセル

同じタグがついた質問を見る

  • SQL

    3010questions

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

  • Oracle Database 11g

    219questions

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