ORA-01461

结合 上面两个看!


SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 -64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE     11.2.0.1.0      Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.1.0 -Production
NLSRTL Version 11.2.0.1.0 - Production

 
SQL> CREATE TABLE T_VARCHAR (name clob);

表已创建。

情景1:
SQL> DECLARE
  2   V_STR VARCHAR2(32767):= lpad('a',32767,'a');
  3   BEGIN
  4   execute immediate'INSERT INTO T_VARCHAR VALUES ('||V_STR||')';           --直接插入可以
  5   commit;
  6   END;
  7   /

PL/SQL 过程已成功完成。

情景2:
SQL> DECLARE
  2   V_STR VARCHAR2(32767):= lpad('a',32767,'a');
  3   BEGIN
  4   INSERT INTO T_VARCHARVALUES (SUBSTR(V_STR,1,10));--截取之后就不可以了
  5   commit;
  6   END;
  7   /
DECLARE
*
第 1 行出现错误:
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
ORA-06512: 在 line 4


SQL> DECLARE
  2   V_STR VARCHAR2(4000) :=lpad('a',4000,'a');
  3   BEGIN
  4   INSERT INTO T_VARCHARVALUES (SUBSTR(V_STR,1,10));--结合情景2 小于等于4000 可以
  5   commit;
  6   END;
  7   /

PL/SQL 过程已成功完成。

SQL> DECLARE
  2   V_STR VARCHAR2(4001) :=lpad('a',4001,'a');
  3   BEGIN
  4   INSERT INTO T_VARCHARVALUES (SUBSTR(V_STR,1,10));--结合情景2 大于4000 不可以
  5   commit;
  6   END;
  7   /
DECLARE
*
第 1 行出现错误:
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
ORA-06512: 在 line 4


情景3:
SQL> DECLARE
  2   V_STR VARCHAR2(32767):= lpad('a',32767,'a');
  3   BEGIN
  4   INSERT INTO T_VARCHARselect v_str from dual;   --这样也不可以
  5   commit;
  6   END;
  7   /
DECLARE
*
第 1 行出现错误:
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
ORA-06512: 在 line 4


情景4:
SQL> DECLARE
  2   V_STR VARCHAR2(4000) :=lpad('a',4000,'a');
  3   BEGIN
  4   INSERT INTO T_VARCHARselect v_str from dual;         --结合情景3 变成4000的长度就可以
  5   commit;
  6   END;
  7   /

PL/SQL 过程已成功完成。


情景5:
SQL> DECLARE
  2   V_STR VARCHAR2(4001) :=lpad('a',4001,'a');
  3   BEGIN
  4   INSERT INTO T_VARCHARselect v_str from dual;         --结合情景4 变成4001的长度就不行了
  5   commit;
  6   END;
  7   /
DECLARE
*
第 1 行出现错误:
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
ORA-06512: 在 line 4


以上说明, 在pl/sql中,对一个多于4000的字符串做substr或sleect  from dual;时会 把这个字符转换成long型,所以报上面的错误。











SQL> DECLARE
  2       V_STR VARCHAR2(4001) := lpad('a',4001,'a');
  3         BEGIN
  4           executeimmediate 'INSERT INTO T_VARCHAR VALUES (''' || V_STR ||''')';
  5       commit;
  6       END;
  7       /
DECLARE
*
第 1 行出现错误:
ORA-01704: 字符串文字太长
ORA-06512: 在 line 4


SQL> DECLARE
  2       V_STR VARCHAR2(4000) := lpad('a',4000,'a');
  3         BEGIN
  4           executeimmediate 'INSERT INTO T_VARCHAR VALUES (''' || V_STR ||''')';
  5       commit;
  6       END;
  7       /

PL/SQL 过程已成功完成。



用execute immediate 语句时 也是有4000个字符的限制。虽然报的错不一样。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值