2017-04-18 2 views
0

테이블에 몇 개의 삽입물을 넣으려고 할 때이 오류가 발생합니다."유효하지 않은 달"또는 숫자

유효하지 않은 달에 관한 오류를 얻고 변경하려고하면 잘못된 숫자 오류가 발생합니다.

ORA-01843: not a valid month ORA-06512: at "SYS.DBMS_SQL" 

코드 : 나는 또한 TO_DATE 사용하지만, 거기에 운이없는 시도했습니다

CREATE TABLE ExpenseReport (
    ERNo   NUMERIC(10) NOT NULL, 
    ERDesc   VARCHAR(255) NOT NULL, 
    ERSubmitDate DATE DEFAULT CURRENT_TIMESTAMP, 
    ERStatusDate DATE NOT NULL, 
    ERStatus  VARCHAR(8) DEFAULT 'PENDING', 
    SubmitUserNo NUMERIC(10) NOT NULL, 
    ApprUserNo  NUMERIC(10) NOT NULL, 
    CONSTRAINT ExpenseReport_CK1 CHECK (ERStatusDate >= ERSubmitDate), 
    CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus = 'PENDING'/'APPROVED'/'DENIED'), 
    CONSTRAINT ExpenseReport_PK1 PRIMARY KEY(ERNo), 
    CONSTRAINT ExpenseReport_FK1 FOREIGN KEY(SubmitUserNo) REFERENCES Users(UserNo), 
    CONSTRAINT ExpenseReport_FK2 FOREIGN KEY(ApprUserNo) REFERENCES (USerNo) 
); 

INSERT INTO ExpenseReport 
    (ERNo, ERDesc, ERSubmitDate, ERStatusDate, ERStatus, SubmitUserNo, ApprUSerNo) 
    VALUES (1,'Sales Presentation','8/10/2002','8/26/2002','APPROVED',3,4); 

내가 잘못된거야 경우, 혹시 사람이 볼 수 있습니다.

+0

to_date ('8/26/2002', 'mm/dd/yyyy')가 작동하지 않습니다. –

+0

필자는 INSERT INTO ExpenseReport \t (ERNO, ERDesc, ERSubmitDate, ERStatusDate, ERStatus, SubmitUserNo, ApprUSerNo) \t VALUES (1 '판매 프레젠테이션'TO_DATE ('01/01/02 '이런 식으로 수행하려고 'DD/MM/YY'), TO_DATE ('02/02/03 ','DD/MM/YY '),'APPROVED ', 3,4); – John

+1

@ 존 - 그 일을 어떻게했을까요? (또한이 자리에서 2 자리 연도를 사용하는 이유는 무엇입니까? 당신은 하루와 둘째로 전환하는 것 같습니까?) –

답변

4

사용에게 DATE keyword 및 표준 날짜 형식 : 표준 날짜 형식을 사용의 만족뿐만 아니라

INSERT INTO ExpenseReport (ERNo, ERDesc, ERSubmitDate, ERStatusDate, ERStatus, SubmitUserNo, ApprUSerNo) 
    VALUES (1, 'Sales Presentation', DATE '2001-08-10', DATE '2001-08-2006', 'APPROVED', 3, 4); 

,이 로컬 설정의 변경에 대해 사용자를 보호합니다. 당신이 점검 제한 조건이 평가되고 값을 삽입하려고 할 때

CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus IN ('PENDING', 'APPROVED', 'DENIED')) 

그리고에 분할 작업을 수행하려고 : 당신의 DDL 문에서

+0

거기에 그 비트의 코드를 사용했는데 여전히이 오류가 발생합니다 ORA-01722 : 잘못된 숫자 ORA-06512 : "SYS.DBMS_SQL"에서 1721 – John

+2

@ John - 잘못된 숫자는 날짜 변환과 관련이 없습니다. 다른 컬럼에서 유입됩니다. 사실, 당신의 체크 제약 ExpenseReport_CK2에서. 더 자세히 보아라. –

+0

@AlexPoole - 이것과 비슷한 칼럼을 날짜없이 써 왔고 완벽하게 작동하고있다.나는 날짜가 이것으로 모든 것을 던지고 있다고 생각하는데, 유럽 형식을 사용함에 따라 시간과 날짜에 대한 다른 형식이 이에 영향을 미칠 수 있습니까? – John

5

는 :

CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus = 'PENDING'/'APPROVED'/'DENIED') 

는이어야한다 세 문자열 값 'PENDING'/'APPROVED'/'DENIED'ORA-01722: invalid number이됩니다.

일단 이것을 변경하면 TO_DATE('01/01/02','DD/MM/YY') (주석에 쓴 것처럼) 또는 ANSI 날짜 리터럴 DATE '2002-01-01'이 DML 문에서 작동해야합니다.

(참고 :주의 사용하여 2 자리 년 수 또는 당신은 dates are inserted with the wrong century. 찾을 수 있습니다)

0
Check your date format: select sysdate from dual; 

을하고 보여로 입력합니다. 또는

change your date format: alter session set nls_date_format= 'DD-Mon-YYYY HH24:MI:SS'; 
+0

NLS 설정에 의존하거나 암시 적 변환을 사용하면 안됩니다. 일회성, 임시 코드를 제외하고는 항상 'to_date()'와 적절한 마스크로 포맷을 명시 적으로 지정하거나, 바람직하게는 고든이 이미 말했듯이 날짜 리터럴을 사용하여 포맷을 명시해야합니다. 귀하의 코드는 귀하가 통제하지 않는 클라이언트 나 세션에서 실행할 수 있으므로 사소한 문제를 해결할 기회를주지 마십시오. –

관련 문제