PROCEDURE proc_testLong( psSql long,Re_CURSOR OUT T_CURSOR) is
       vssql varchar2(5000); 
    BEGIN   
      /*insert into t (t1)values(psSql);*/
vssql:='select * from t ';
    open Re_CURSOR FOR vsSQL;
  end proc_testLong;
上面是我写的 一个 测试 存储过程。给pssql传得值大于  32767 时  就报 “ORA-01460换请求无法实现或不合理”  错误,请问大家 怎么解决 ??是我数据库的问题吗?

解决方案 »

  1.   

    你自己去找定义, long 就是 subtype of varchar2(32767) 当然会报错。
      

  2.   

    long 不是能存储2GB的字符 吗?
      

  3.   


    那是BLOB  CLOB
    Long就是varchar2(32767)
      

  4.   

    long 范围是2GB   限制是 32767 字节。不知道2GB 是什么概念 ???能给详细讲下long吗?谢谢!
      

  5.   

    关于Long类型的解释,请参考下面链接:
    http://wsqwsq000.iteye.com/blog/1120667在这里面我看到了这样一句话:
    “4、很多工具,包括SQL*Plus,处理LONG 数据类型都是很困难的。 ”
      

  6.   


    先说下1G的相关概念:
    1K=1024bytes(字节)
    1M=1K*1024=1024 *1024bytes(字节)
    1G=1M*1024=1024*1024 *1024bytes(字节)那么2G=2*1024*1024 *1024bytes=2147483648 bytes(字节)
    也就是说一个LONG类型的变量最多可以存储 2147483648个字节。
      

  7.   

    其实我想实现的业务是,向一个临时表中插入大量数据,然后在存储过程中对数据进行处理,返回处理结果ds.,因此考虑 把插数据部分 拼成一个大sql  当做参数 传入存储过程,用了long类型 就报了上面的错。测试发现  sql 的字符数>32767时就报 上面的错。不知道 32767  和 2147483648  是 怎么回事?
      

  8.   

    楼主用的应该是ref cursor类型, 它所能接受的动态SQL最大不能超过32K,估计就是这个原因了
      

  9.   

    我测了一下:把存储过程改成
    PROCEDURE proc_testLong( psSql long) is
      vssql varchar2(5000);  
      BEGIN   
    vssql:='select * from t ';
      end proc_testLong;报同样的错!
     
      

  10.   

    我觉得很清楚了,不知道你问的是什么long 就是varchar2(32767)
    你的SQL 字符长度超过了32767报错,有什么不对的吗?
    还是你觉得2G字节应该等于1G长度的varchar2?
      

  11.   

    奇怪,32767应该是plsql中varchar的上限。
    莫非你一个字符占用64字节
    没可能这么大啊
      

  12.   

    http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/datatypes.htm
    You use the LONG datatype to store variable-length character strings. The LONG datatype is like the VARCHAR2 datatype, except that the maximum size of a LONG value is 32760 bytes.You use the LONG RAW datatype to store binary data or byte strings. LONG RAW data is like LONG data, except that LONG RAW data is not interpreted by PL/SQL. The maximum size of a LONG RAW value is 32760 bytes.You can insert any LONG value into a LONG database column because the maximum width of a LONG column is 2147483648 bytes or two gigabytes. However, you cannot retrieve a value longer than 32760 bytes from a LONG column into a LONG variable.Likewise, you can insert any LONG RAW value into a LONG RAW database column because the maximum width of a LONG RAW column is 2147483648 bytes. However, you cannot retrieve a value longer than 32760 bytes from a LONG RAW column into a LONG RAW variable.
    这个应该说的很明白,虽然long的容量很大,但是使用变量进行操作时,只能分段处理,每次最多处理32760个字节
      

  13.   

    你也可以这样认为,plsql里long类型的变量和表中long类型字段的容量不同。
      

  14.   

    LONG已经准备被Oracle弃用了,除非是已存在的应用就别用它了
      

  15.   

    恩,明白了,“, you cannot retrieve a value longer than 32760 bytes from a LONG RAW column into a LONG RAW variable.
    ”  谢谢。