因未自动转换类型而ORA-01461之一例

oracle10.2.0.4版本

字符变量(比如v_mail_tmp)超过4000字节,即使是将substr(v_mail_tmp,1,1333)插入一个VARCHAR2(4000)的字段,该表只有一个4000的字段

也会报ORA-01461,can bind a LONG value only for insert into a LONG column

最后的解决办法是定义一个varchar2(4000)的变量v_CONTENT,做一次赋值v_CONTENT:=substr(v_mail_tmp,1,1333),再将v_CONTENT插入表就不报错了

原因估计是超过4000后,当作long型处理,做substr,long型未变导致无法插入,而赋值给varchar2(4000)的变量可以将类型强制转回来

验证这个想法

SQL> create table ta (t1 varchar2(4000));

Table created

SQL> declare
2 v_tmp varchar2(10000);
3 begin
4 v_tmp:='1';
5 insert into ta (t1)values(v_tmp);
6 end;
7 /

PL/SQL procedure successfully completed

SQL> select * from ta;

T1
--------------------------------------------------------------------------------
1

SQL> declare
2 v_tmp varchar2(10000);
3 v_tmp1 varchar2(4000);
4 begin
5 for i in 1..5000 loop
6 v_tmp:=v_tmp||'1';
7 end loop;
8 insert into ta (t1)values(substr(v_tmp,1,1));
9 end;
10 /

declare
v_tmp varchar2(10000);
v_tmp1 varchar2(4000);
begin
for i in 1..5000 loop
v_tmp:=v_tmp||'1';
end loop;
insert into ta (t1)values(substr(v_tmp,1,1));
end;

ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 9

SQL> declare
2 v_tmp varchar2(10000);
3 v_tmp1 varchar2(4000);
4 begin
5 for i in 1..5000 loop
6 v_tmp:=v_tmp||'1';
7 end loop;
8 v_tmp1:=substr(v_tmp,4000);
9 insert into ta (t1)values(v_tmp1);
10 end;
11 /

PL/SQL procedure successfully completed
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值