2017-08-04 59 views
0

SQL * Loaderスクリプトを使用して、CSVファイルからOracleテーブルに値を入力しています。この表には、NOT NULLという制約があるフィールドがあります。私のCSVファイルでは、対応するフィールドは""であり、そのときにOracleテーブルに空の文字列を入れたいと思います。oracleテーブルの制約がNOT NULLのsqlloader

これは私の制御ファイルです:

LOAD DATA 
    infile 'F:\tar.csv' 
    REPLACE 
    INTO TABLE tar 
    fields terminated by ',' optionally enclosed by '"' 
    TRAILING NULLCOLS 
    (IDTAR , 
DATABACKUP DATE "YYYY-MM-DD", 
PAESE , 
R_ELEM NULLIF (R_ELEM=BLANKS)) 

と、これは、ログファイル内のエラーです:

ORA-01400:。。( "MY_SCHEMA" "TAR" にNULLを挿入することはできません」パエーゼ")

別の値を指定してエラーを回避するにはどうすればよいですか?

+0

空白の文字列とはどういう意味ですか?空の文字列は、Oracleではnullと同じです。したがって、空白文字は1つまたは複数ですか?テーブルDDLとCSVファイルのサンプルデータも役立ちます。 –

+0

空の文字列は、Oracleのnullと同じです.Ahh !!! それはポイントです! –

+0

["Oracle Databaseは現在、長さがゼロの文字値をnullとして扱いますが、将来のリリースではこれが続くことはありません。空の文字列をNULLと同じように扱わないことをお薦めします。 ://docs.oracle.com/database/121/SQLRF/sql_elements005.htm#SQLRF30037) –

答えて

1

apply an SQL operator、たとえばNVL(:PAESE, 'XXX')などです。フィールド名への参照の前にコロンがあることに注目してください。

LOAD DATA 
    infile 'gian.csv' 
    REPLACE 
    INTO TABLE tar 
    fields terminated by ',' optionally enclosed by '"' 
    TRAILING NULLCOLS 
    (
    IDTAR, 
    DATABACKUP DATE "YYYY-MM-DD", 
    PAESE "NVL(:PAESE, 'XXX')", 
    R_ELEM NULLIF (R_ELEM=BLANKS) 
) 

ダミーテーブルで:インサイチュ

テーブルタール作成(nullでない idtar番号、 データバックアップ日時、 パエーゼVARCHAR2(10)、 r_elemのVARCHAR2(10) )。

と3番目と4番目の行がnullif()句の末尾のスペースをしているCSV、:

1,2017-08-01,A,B 
2,2017-08-02,C, 
3,2017-08-03,,  
4,2017-08-04,"",  

を、その制御ファイルを使用して実行するには、取得します。

SQL*Loader: Release 11.2.0.4.0 - Production on Fri Aug 4 19:39:23 2017 

Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 

Commit point reached - logical record count 4 

とログは言う:

... 
    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
IDTAR        FIRST  * , O(") CHARACTER 
DATABACKUP       NEXT  * , O(") DATE YYYY-MM-DD 
PAESE        NEXT  * , O(") CHARACTER 
    SQL string for column : "NVL(:PAESE, 'XXX')" 
R_ELEM        NEXT  * , O(") CHARACTER 
    NULL if R_ELEM = BLANKS 


Table TAR: 
    4 Rows successfully loaded. 
    0 Rows not loaded due to data errors. 
    0 Rows not loaded because all WHEN clauses were failed. 
    0 Rows not loaded because all fields were null. 
... 

表の問合せでは、4つの行がすべてロードされたことが示されます。

set null "<null>" 
select * from tar; 

    IDTAR DATABACKU PAESE  R_ELEM  
---------- --------- ---------- ---------- 
     1 01-AUG-17 A   B   
     2 02-AUG-17 C   <null>  
     3 03-AUG-17 XXX  <null>  
     4 04-AUG-17 XXX  <null>  

明らかに、'XXX'を使用したい実際のデフォルト文字列に置き換えます。あなたは '空文字列'と言っていたので、たとえば、空白文字を挿入するのに"NVL(:PAESE, ' ')"を使うことができます。 空の文字列を使用することはできません。これは、Oracleに関する限り、nullと同じです。