ORA-01461解決過程

hky87發表於2010-11-05
Normal 0 0 2 false false false EN-US ZH-TW X-NONE今日資料庫報ORA-01461錯誤,在網上搜尋了下了解了錯誤原因,並記錄下測試示例:

create table test (a varchar2(1));

declare

v_a varchar2(5000):=lpad('a',5000,'a');

begin

insert into test values(substr(v_a,1,1));

end;

ORA-01461: can bind a LONG value only for insert into a LONG column

ORA-06512: at line 4

 

而如果這樣寫就對了

declare

v_a varchar2(5000):=lpad('a',5000,'a');

v_b varchar2(1):=substr(v_a,1,1);

begin

insert into test values(v_b);

end;

 

說明問題出在執行substr的時候,再改下

declare

v_a varchar2(4000):=lpad('a',4000,'a');

begin

insert into test values(substr(v_a,1,1));

end;

可以成功執行。

 

總結:在PL/SQLvarchar2最大可支援32767位元組;在SQLvarchar2最大可支援4000位元組,insert時如果宣告的變數長度超過了sql中型別長度,就會觸發ORA-01461錯誤,所以在插入之前截斷字元到符合要求的長度即可。從以上例子可看出,必需在插入之前對字串進行擷取,不能在插入時才對字元進行擷取。

這應該是由於pl/sql引擎在編譯時對變數長度的判斷先於substr進行..

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10314474/viewspace-677557/,如需轉載,請註明出處,否則將追究法律責任。

相關文章