我有个值要插入一张表,比如表结构很简单:id number(10),name nclob
现在有个name的值长度很长,会达到上万的长度,如果直接写普通的SQL:insert into tab_user values(1,'......');
执行的时候,oracle会报:ORA-01704: string literal too long   的错误。
请问各位高手,这个SQL怎么写才能正常入进表里呢?请指教下,本人很菜鸟。

解决方案 »

  1.   

    往oracle函CLOB、LONG字段类型的数据表插入值超过4000字节时,在执行INSERT INTO提示:ORA-01704:文字字符串过长错误,这种情况下,如果想用SQL实现的话,可以通过ORACLE存储过程实现
    --处理方法一:用EXECUTE IMMEDIATE 实现--ASQL:带参数的INSERT INTO 语句
    --ALongVar1 : 参数值,大于4000字节
    CREATE OR REPLACE PROCEDURE EXEC_SQL1(ASQL varchar2, ALongVar1 clob)
    AS
    BEGIN
    EXECUTE IMMEDIATE ASQL USING ALongValue;
    END EXEC_SQL1;
    --处理方法二:用Dbms_sql接口实现--ASQL:带参数的INSERT INTO 语句
    --ALongVar1 : 参数值,大于4000字节
    CREATE OR REPLACE PROCEDURE EXEC_SQL(ASQL clob, ALongValue clob)
    AS
    The_c1 Integer; 
    The_result Integer;--dml_sql_result 
    BEGIN
     The_C1 :=Dbms_sql.open_cursor; 
     Dbms_sql.parse(the_C1, ASQL, DBMS_SQL.NATIVE); 
     DBMS_SQL.BIND_VARIABLE
     (The_c1, ':LongValue', ALongValue);
     The_result:=Dbms_sql.execute(The_c1); 
     Dbms_sql.close_cursor(The_C1);
    END EXEC_SQL;
      

  2.   

    请问下有不写存储过程的方法吗?我是在java代码里拼装SQL,然后执行的
      

  3.   

    CREATE OR REPLACE PROCEDURE EXEC_SQL1(ASQL varchar2, ALongVar1 clob)
    AS
    BEGIN
    EXECUTE IMMEDIATE ASQL USING ALongValue;
    END EXEC_SQL1;
    你在java里拼接好,然后insert语句写出这样insert into tab_user values(1,'&var');
    拼接好要插入的字符 在把这里个作为参数传到过程里
      

  4.   

    那还是要写存储过程啊,我意思是,不写任何存储过程,有什么别的方法吗?顺便问一句,oracle支持多长的SQL语句啊?多谢指教
      

  5.   

    4000应该是默认到顶了,zhuomingwang的方法很好啊,为什么不拿到存储过程中去做呢?
    另外你可以考虑分段执行adoquerysql.add()好像可以分段
      

  6.   

    可以不用存储过程 ,写成EXECUTE IMMEDIATE 'insert into tab_user(id,name) using(yourid,yourname)';
      

  7.   

    EXECUTE IMMEDIATE 'insert into tab_user(id,name) values(yourid,yourname)';
      

  8.   

    直接告诉你不行,oracle CLOB、LONG字段类型的数据表插入值不能超过4000字节
      

  9.   

    clob在sql语句里有长度限制。
    还是用jdbc写text读写吧。asciistream, 网上有很多例子。