2016-10-04 7 views
0

에 유리수를로드하는 방법을 나는이 형식 번호와 데이터 파일이 있습니다Oracle 데이터베이스

나는 쉼표 대신 포인트로 변환해야
xx.xx (example : 0.3) 

가 데이터베이스에로드 할 수 있습니다. 그것은 잘 작동하지만 0.3이 더 0으로, 3이된다

LOAD DATA 
REPLACE 
INTO TABLE USER.MYTABLE 
FIELDS TERMINATED BY '$' 
TRAILING NULLCOLS 
(FIELD1,FIELD2,FIELD3,FIELD4,FIELD5, 
NUMBER_FIELD "to_number(replace(:NUMBER_FIELD, '.', ','))", 
FIELD6,FIELD7,FIELD8) 

: 여기 내 제어 파일입니다. 거기에 뭐가 잘못 되었나요? 이 같은

LOAD DATA 
REPLACE 
INTO TABLE USER.MYTABLE 
FIELDS TERMINATED BY '$' 
TRAILING NULLCOLS 
(FIELD1 DECIMAL(6,0), 
FIELD2 VARCHAR, 
FIELD3 VARCHAR, 
FIELD4 VARCHAR, 
FIELD5 VARCHAR, 
FIELD6 FLOAT, 
FIELD7 FLOAT, 
FIELD8 DATE, 
FIELD9 VARCHAR) 

데이터 라인 : 제안

내가 내 제어 파일을 변경

주셔서 감사합니다

1 $ 005 $ 05 $ 1 $ blablabla $ 0.50 $ 0 $ 1월 2일/1996 $ 01

나는 오류가 있습니다.

로그 파일을 지정된 정밀도보다 큰 값을 허용 : 나는 아이폰에 계산되어 있지만

  • 내가 FIELD1에 오류가 잘못 잘 모릅니다

    Column Name     Position Len Term Encl Datatype 
    

    FIELD1  FIRST  4   PACKED DECIMAL (6, 0) 
    FIELD2  NEXT  *   VARCHAR    
    FIELD3  NEXT  *   VARCHAR    
    FIELD4         NEXT  *   VARCHAR    
    FIELD5  NEXT  *   VARCHAR    
    FIELD6  NEXT  4   FLOAT     
    FIELD7  NEXT  4   FLOAT     
    FIELD8  NEXT  * $  DATE DD/MM/YYYY  
    FIELD9  NEXT  *   VARCHAR    
    
    1. 이 열. 날짜 필드에
    2. 오류 달의 날이 달의 1과 마지막 날 사이에 있어야합니다 말한다.
  • +0

    새로운 문제가있는 경우 새로운 질문을하십시오. 로드중인 테이블에 대한 DDL과 .bad 파일의 실제 데이터가 포함될 수 있습니다. 하지만 필자는 중요한 필드 유형 만 지정합니다. 암시 적으로 변환해야하는'VARCHAR' 및'DECIMAL'을 삭제하십시오. 날짜 1의 경우 파일 DD/MM/YYYY 또는 실제로 MM/DD/YYYY에있는 값입니다. 오류는 후자를 의미합니다. [형식 마스크를 지정할 수 있습니다.] (https://docs.oracle.com/cd/E11882_01/server.112/e22490/ldr_field_list.htm#sthref792). –

    +0

    아니요 파일에서 DD/MM/YYYY입니다.하지만 마지막으로 날짜를 지정하지 않으며 암시 적으로 변환됩니다. 그래서 해결되었습니다 – mlwacosmos

    답변

    1

    당신이 부분적으로 있기 때문에 당신의 NLS 설정 ,3로 포맷되어있는 번호를 조회하는 세션. 그래서 당신의 NLS_NUMERIC_CHARACTER_SETTING이 ',.' 될 소수 구분은 쉼표 귀하의 프로필에서 당신은 프랑스에 있습니다. SQL * Plus 및 SQL Developer 워크 시트에서 기본 숫자 형식은 선행 0을 표시하지 않습니다.당신이 선두를보고 싶다면 제로는 형식을 지정해야합니다

    select to_char(number_field, 'FM9990D999') from mytable 
    
    세션의 소수 구분 기호를 사용합니다

    ;

    select to_char(number_field, 'FM9990D999', 'NLS_NUMERIC_CHARACTERS='',.''') from mytable 
    

    FM 정거장 소수점 후미 제로 떠난다; 또는 그 강제 만약 당신이 그들을보고 싶다면 그 수정자를 내버려 둬라.

    로드 할 때 수행중인 변환이 필요하지 않아야합니다. 제어 파일을 다음과 같이 바꿀 수 있습니다 :

    NUMBER_FIELD FLOAT, 
    

    이 자동으로 숫자로 처리됩니다 그것은 문자로 :NUMBER_FIELD을 처리하는 것보다 깨끗합니다. '십진'대체를 수행 한 다음 NLS 설정을 사용하여 숫자로 변환합니다.

    NUMBER_FIELD "to_number(:NUMBER_FIELD, '9999D999', 'NLS_NUMERIC_CHARACTERS=''.,''')", 
    

    것은 당신이 to_number() 또는 to_char()를 들어, 당신은 분명 충분히 0/9 자리를 소수점 문자의 각 측면을 허용해야, 숫자 형식을 지정 :

    당신은 또한 NLS를 지정할 수는 다른 방법으로 초기 설정 실제로 보유하고있는 데이터입니다. 자릿수를 모르거나 지정하지 않으려는 경우 SQL * Loader를 실행하기 전에 마침표를 소수점으로 사용하는 영토로 NLS_LANG를 설정하고 "to_number(:NUMBER_FIELD)"을 수행 할 수 있습니다. 그래도 FLOAT을 사용하는 것이 더 간단합니다.

    +0

    로딩이 좋았다고 말해줘. – mlwacosmos

    +0

    @mlwacosmos - 로딩이 좋다고 말하고있다. (어쨌든 대안을 제시했다.); 그 수에는 본질적인 형식이 없습니다. 및 소수점 구분 기호 앞에 0을 사용하여 숫자를 * 표시 할 수있는 방법. 어느 mathguy도 보여주는 것입니다. –

    0

    번호는 쉼표를 포함 할 수 없습니다. 당신이하려고하는 것은 to_number 함수를 사용하여 숫자가 아닌 문자열을 만드는 것입니다. to_char는 원하는 결과를 생성 할 수 있습니다.

    +0

    문자열은'replace()'가 여러분에게 줄 것입니다 - 숫자로 변환되는 것은 쉼표를 가질 수 있습니다; 이 경우'to_number()'는 NLS 설정을 사용하여 해당 문자열을 숫자로 변환합니다. 쉼표는 소수 구분 기호로 정의해야합니다. 'to_number' 함수를 사용하여 문자열을 생성 할 수 없습니다 ... –

    1

    숫자를 숫자로 저장하는 것이 훨씬 낫습니다 (어떤 식 으로든 형식이 지정되지 않고 값만 저장 됨). 그런 다음 모든 숫자 연산을 매우 쉽게 수행 할 수 있습니다 쿼리를 작성하고 DB에서 데이터를 추출 할 때만 OUTPUT의 형식을 지정합니다 (예 : 저장된 데이터의 숫자 조작 후). 에 관계없이

    , 나는 숫자에서 다른 문자 형식을 가져 오는 방법을 설명 아래. 더 많은 가능성을 위해서는 오라클 설명서 to_char(number)을보십시오. 출력은 내 세션의 NLS_NUMERIC_CHARACTERS를 기반으로합니다. 십진법과 천 단위 구분 기호.

    select 0.3 as nmbr, to_char(0.3, '9.99') as str1, to_char(0.3, '0.00') as str2, 
         to_char(0.3, '0D0', 'nls_numeric_characters='',.''') as str3 from dual; 
    
         NMBR STR1 STR2 STR3 
    ---------- ----- ----- ---- 
         .3 .30 0.30 0,3 
    
    +0

    숫자로 저장되어있는 것 같습니다. 로드는 명시 적으로'to_number()'를 호출하여 NLS 설정에서 암시 적 변환 문제를 피할 수 있습니다. 나는 생각한다. –

    +1

    @AlexPoole - 현재 코드가 값을 숫자로로드하거나 저장하지 않는다는 것을 의미하지는 않습니다. 오히려, OP는로드하기 전에 "쉼표로 변환"에 관해 이야기했기 때문에, char 값을 저장하는 것으로 변경할 것을 고려할 수도 있습니다. 나는 그것이 최적이 아니라고 단순히 의견을 나누고 있었다. 건배! – mathguy

    +0

    나는 당신과 당신의 의견에 동의한다. 오라클 구성이지만 쉼표는 데이터 파일에서 데이터베이스로 로딩 할 때 오라클 번호가 올바른 형식이 아니기 때문에 숫자를 인식하는 데 사용됩니다. – mlwacosmos

    관련 문제