2016-09-07 263 views
-1

執行以下時,我得到一個錯誤,我想顯示錯誤信息而不是錯誤:ORA-06550在PLSQL

declare 
    bday date not null := '13-sep-78'; 
begin 
    bday := '12-oct-09'; 
    bday := NULL ; 
    DBMS_OUTPUT.PUT_LINE(bday); 
end; 

錯誤如下:

錯誤報告 -

ORA-06550: line 5, column 9: PLS-00382: expression is of wrong type
ORA-06550: line 5, column 1: PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

+2

''12 -oct-09''不是'日期',它是'varchar' – SomeJavaGuy

回答

-1
declare 
    bday varchar2(50) not null := '13-sep-78'; 
begin 
    bday := '12-oct-09'; 
    --bday := NULL ; 
    DBMS_OUTPUT.PUT_LINE(bday); 
end; 

如果設置BDAY不爲null,則你不能將其設置爲null value.And BDAY應該是VARCHAR2或somethingels e由於你的價值。

+0

這不是爲什麼該行會拋出*錯誤*。 – APC

+0

發生此錯誤是因爲您的bday值應該是您的'13 -sep-78'值的varchar2。並且必須設置一個值,因爲您將它聲明爲「Not null」.I評論bday:= NULL行因此。 – FreeMan

+0

沒有。 Oracle可以隱式地處理某些日期轉換。否則,我們希望看到'ORA-01843'或類似的錯誤消息。導致OP看到的特定錯誤消息的原因是試圖隱式地將NULL轉換爲日期。 'to_date(null)'拋出一個不同的錯誤信息。請參閱[我的答案](http://stackoverflow.com/a/39368881/146325)瞭解更多。 – APC

3

首先,讓我們討論一下是不是導致了錯誤,但究竟是還是錯在你的代碼:)

您分配一個字,它是一個字符串,聲明爲一個日期變量:

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的值。這個值可能是意想不到的,這說明了爲什麼真正的代碼需要更好的異常處理(即更多的細節,更多的上下文信息)。

0

這是一個編譯時錯誤,必須先修復,然後才能真正運行代碼。

由於你的問題是關於如何顯示一條消息而不是默認的Oracle錯誤,我懷疑這是一個關於異常處理的練習,並且是爲了引發一個錯誤來練習抓取它以顯示你自己的錯誤信息?如果是從這裏開始的一些基本知識:https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm

如果沒有,讓我知道在一條評論,我會刪除這篇文章。