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