2014-09-10 165 views
0

如果此問題已被提前詢問,我很抱歉。我一直在四處尋找答案,並且此錯誤消息的所有答案似乎涉及日期字段。但是,以下沒有日期字段:SQL - 文字不匹配格式字符串

create table tableName (
    trans_dest_name varchar2(50) not null, 
    mmddyyyy  varchar2(8) not null, 
constraint holiday_key primary key (trans_dest_name, mmddyyyy), 
constraint trans_dest_name_ch check(REGEXP_LIKE(trans_dest_name,'^[a-zA-Z0-9 ]{0,50}$')), 
constraint holiday_format check (
    (to_number(substr(mmddyyyy, 0, 2))) < 13 
    AND (to_number(substr(mmddyyyy, 0, 2))) > 0 
    AND (to_number(substr(mmddyyyy, 2, 2))) < 32 
    AND (to_number(substr(mmddyyyy, 2, 2))) > 0 
    AND (to_number(substr(mmddyyyy, 4, 2))) = 20) 
); 

insert into tableName VALUES ('Power Pass', '01012015'); 

僅供參考,這是一個同事來找我的問題。我不完全確定他們爲什麼使用字符串來表示日期,但這是他們決定採用的格式。問題是......看起來好像插入中的「Power Pass」值拋出了這個特定的錯誤...而不是日期字符串。

SQL> SQL> insert into tableName VALUES ('Power Pass', '01012015') 
              * 
ERROR at line 1: 
ORA-01861: literal does not match format string 

我最初的想法是,它是導致問題的日期字符串,可能是試圖將它轉換爲約束中的數字。它似乎並不是這樣,因爲當我說同事嘗試插入日期字符串作爲數字時會出現新的錯誤消息。

SQL> SQL> insert into tableName VALUES ('Power Pass', 01012015) 
* 
ERROR at line 1: 
ORA-00932: inconsistent datatypes: expected DATE got NUMBER 

所以這部分很奇怪。爲什麼期望在該領域的日期?我完全被這個問題困擾。任何幫助將不勝感激。謝謝!

+2

這不能是錯誤,除非第二列是'DATE' !!首先,當你試圖插入一個字符串時,Oracle試着使用'NLS_DATE_FORMAT'來隱式的日期轉換。然後,因爲它不匹配,它就拋出了一個錯誤。最後,當你嘗試使用一個數字時,錯誤信息是現在直截了當!這張桌子上的任何觸發器? – 2014-09-10 18:51:30

+0

我給出的代碼塊中的所有內容都是原樣的。表和插入語句的創建是通過shell腳本完成的。這裏沒有觸發器。 – amthomas2112 2014-09-10 18:56:31

+1

小提琴很好[這裏](http://sqlfiddle.com/#!4/6f885/1) – 2014-09-10 19:00:39

回答

1

除了Maheswaran Ravisankar指出的錯誤索引外,您發佈的代碼不會引發錯誤。 IOW:您看到的錯誤必須來自您未發佈的內容。以下是一些您可能會嘗試的操作:

  • 檢查原始代碼。我假設你對它進行了輕微的編輯,而表格並沒有真正叫做「tableName」。也許是另一個錯誤滑入了。可能你沒有插入這張桌子,而是另一個。
  • 在真實數據庫中查找user_dependencies並驗證真正沒有,ex(即沒有觸發器等)依賴於該表。或者使用像蟾蜍這樣的工具來檢查表格。
  • 查找user_constraints來驗證沒有約束,您沒有向我們展示,哪些需要日期轉換。
  • 刪除表格並重新插入。您應該獲得ORA-00942: table or view does not exist,否則請參閱第1項。