From: http://lzfhope.blog.163.com/blog/static/6363992200911854940860/
ly for insert into a LONG column
Cause: An attempt was made to insert a value from a LONG datatype into another datatype. This is not allowed.
Action: Do not try to insert LONG datatypes into other types of columns.
----------------------
翻译为中文就是不能把Long类型数据绑定到非long列中,很直白吧!
一般的情况,咱们不说,就说一种特殊的情况,还是举个例子最好说明。
使用关键字values插入大于8000的varchar2。
SQL> create table test_lob(OperationTime date,Sqls clob);
Table created
SQL>
SQL> Declare
2 vx Varchar2(32767);
3 Begin
4 For i In 1..3000 Loop
5 vx:=vx||'0123456789';
6 End Loop;
7 Insert Into test_lob Values(Sysdate,vx);
8 End;
9 /
PL/SQL procedure successfully completed
SQL> commit;
Commit complete
另外一种写法使用子查询.
SQL> Declare
2 vx Varchar2(32767);
3 Begin
4 For i In 1..3000 Loop
5 vx:=vx||'0123456789';
6 End Loop;
7 --Insert Into test_lob Values(Sysdate,vx);
8 Insert Into test_lob
9 Select Sysdate,vx From dual;
10 End;
11 /
Declare
vx Varchar2(32767);
Begin
For i In 1..3000 Loop
vx:=vx||'0123456789';
End Loop;
--Insert Into test_lob Values(Sysdate,vx);
Insert Into test_lob
Select Sysdate,vx From dual;
End;
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
ORA-06512: 在 line 8
以上两个插入方法的差别在于语法不一样,前者是利用关键字values一条条插入,后面是使用子查询的方式插入。
无需要问为什么--事实就是这么回事。
从以上二种写法的差异来看,可以得出以下结论:
1)当用关键字values插入单条的时候,pl/sql可以把varchar2当作VARCHAR2插入到CLOB。
2)但用子查询的时候,超过8000的varchar2变量会被转化为LONG类型返回
之所以,有这样的情况出现,是因为oracle导致的,oracle大概现在只能这么处理。当超长的VARCHAR2出现在select列表中的时候,是当作CLOB存储还是LONG列来存储,这是涉及到很多地方的,修改起来不太方便。
还有关于程序bug的。
http://lzfhope.blog.163.com/blog/static/63639922009427114510786/