首先,讓我們討論一下是不是導致了錯誤,但究竟是還是錯在你的代碼:)
您分配一個字,它是一個字符串,聲明爲一個日期變量:
bday date not null := '13-sep-78';
但是您依靠Oracle來執行轉換,如果字符串的格式與系統的默認蒙版不同,則這是個問題。通常Oracle可以計算出日期掩碼並隱式處理轉換。有時候不會,在這種情況下,它可能會拋出ORA-01843: not a valid month
或類似的異常。依靠Oracle隱式轉換是不安全的。總是,總是用明確的數據類型轉換:
bday date not null := to_date('13-sep-1978', 'dd-mon-yyyy');
而且,它是不好的做法,用兩位數來,隨着甲骨文將其默認的東西你不期待,就像0078.始終包括世紀,它會讓你從一個痛苦的世界中解脫出來。
錯誤
不過的真正原因,這是拋出異常的實際行是這一個:
bday := NULL ;
ORA-06550
是一個編譯錯誤。 NULL不是一個字符串或其他任何東西,所以Oracle甚至不會嘗試將它轉換爲日期。該代碼不會編譯,因此它不會運行,除了修復該錯誤外,沒有辦法處理它。一旦你這樣做了,你會得到下一個錯誤。 :)
SQL> declare
2 bday date not null := date '2016-09-11';
3 begin
4 bday := to_date(null);
5 end;
6/
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 4
這一個是運行時錯誤,被聲明爲not null
變量賦值NULL拋出。要正常處理錯誤,你需要一個異常處理程序。最基本的你的目的是...
declare
bday date not null := '13-sep-78';
begin
bday := '12-oct-09';
bday := to_date(null);
exception
when others then
DBMS_OUTPUT.PUT_LINE('bday = ['||to_char(bday)||']');
end;
...但你會想要更好的東西在現實生活中。
注意:運行上面的代碼,看看異常處理程序顯示BDAY的值。這個值可能是意想不到的,這說明了爲什麼真正的代碼需要更好的異常處理(即更多的細節,更多的上下文信息)。
來源
2016-09-07 11:38:04
APC
''12 -oct-09''不是'日期',它是'varchar' – SomeJavaGuy