昨天生产环境有个严重问题,报了ora-01461的错误,这个问题看似应该是开发那边的问题,但dba这边也得提供一些信息,自己模拟测试了一把。
为问题的排查也提供了一些帮助。
这个问题可以使用一下场景来对比测试。
--》场景 #1
使用关键字values来插入。
using key word “values” to insert.
SQL> Declare
vx Varchar2(32767);
Begin
For i In 1..3000 Loop
vx:=vx||'0123456789';
End Loop;
dbms_output.put_line('length:'||length(vx));
Insert Into test_lob Values(Sysdate,vx);
End;
/
length:30000
PL/SQL procedure successfully completed.
--》场景 #2
使用子查询来插入,如果变量值大于4000,就会自动把变量分成两部分作为long data type来插入。
Using subquery to insert, variable values larger than 4000 will divided into parts for long datatype.
SQL> Declare
vx Varchar2(32767);
Begin
For i In 1..400 Loop
vx:=vx||'0123456789';
End Loop;
vx:=vx||'.';
--Insert Into test_lob Values(Sysdate,vx);
dbms_output.put_line('length:'||length(vx));
Insert Into test_lob
Select Sysdate,vx From dual;
End;
/
length:4001
Declare
*
ERROR at line 1:
ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 10