ORA-01461

http://lzfhope.blog.163.com/blog/static/6363992200911854940860/
http://junsansi.itpub.net/post/29894/476074
结合 上面两个看!


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个字符的限制。虽然报的错不一样。。

你可能感兴趣的:(ORA错误处理)