突然在写程序的时候发现了个小问题,环境为Oracle10g,工具PL\SQL DEVELOPER7.1.5  ,写一个存储过程
例如:
有一个变量 V_I IN VARCHAR2(4000); 
下面我求出传入的字符串的长度
CREATE OR REPLACE PROCEDURE TEST_LENGTH(
V_I  varchar2--传入参数
) IS
V_I_STR varchar2(4000);--传入参数
v_r number(8);--计数
BEGINV_I_STR := V_I;--传入参数select length(V_I_STR) INTO v_r FROM DUAL;DBMS_OUTPUT.put_line(v_r);END;
如果我传入的字符串大于2001,就会抛出错误ora-01480 trailing null missing from STR bind value
如果我传入的字符串小于 ,等于2000,就不抛出错误。
不知道Varchar2(4000)为啥缩水了??如果单独用Length()函数
SELECT LENGTH(str) FROM DUAL;
这里如果str的长度我传入大于4000的就会报错ora-01704 string literal too lang这里想问Length()函数中的字符串有长度限制啊?---如果我把存储过程中的参数类型换成 LONG 型
CREATE OR REPLACE PROCEDURE TEST_LENGTH(
V_I  LONG--传入参数
) IS
V_I_STR LONG;--传入参数
v_r number(8);--计数
BEGINV_I_STR := V_I;--传入参数select length(V_I_STR) INTO v_r FROM DUAL;DBMS_OUTPUT.put_line(v_r);END;这里我传入的字符串长度 是4000,这时可以通过了。不报错了
但是如果我传入的是4001,这时就又报错了。。ORA-01460: unimplemented or unreasonable conversion requested请各位大哥们给小弟解答解答,指点迷津下被?呵呵 谢谢哦!

解决方案 »

  1.   

    long的最大长度为:32760
    varchar 的最大长度为:32767
      

  2.   

    11g是这样子的
    定义long是不需要指定长度
    varchar2 要这样写:varchar2(32767);
      

  3.   

    select userenv('language') from dual; 得出:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 
    请问字符集对oracle 的varchar2 的长度是否有影响????
      

  4.   

    修改这个声明
    V_I_STR varchar2(32767);--传入参数如果表中,VARCHAR2则最大只能是4000字节;
    在存储过程中,VARCHAR2最大可到32767字节;oracle推荐使用clob和blob,限制较少;
    oracle不推荐使用long了。long最大可达2G,
    clob最大可达4G
      

  5.   

    VARCHAR2:存储可变长度字符串,最大4000个字节
    LONG :存储可变长度字符数据,最多能存储 2GB。已经很少被使用。
    LONG RAW 数据类型用于存储可变长度的二进制数据,最多能存储 2 GB,已经很少被使用
    LOB 称为“大对象”数据类型,可以存储多达 4GB 的非结构化信息,例如声音剪辑和视频文件等
    CLOB 即 Character LOB(字符 LOB),它能够存储大量字符数据
    BLOB 即 Binary LOB(二进制 LOB),可以存储较大的二进制对象,如图形、视频剪辑和声音文件  我昨天刚学了,现学现卖了,呵呵呵.....
      

  6.   

    SQL> declare
      2  a varchar2(32767);
      3  begin
      4  for i in 1..32767 loop
      5  a := a || 't';
      6  end loop;
      7  dbms_output.put_line(length(a));
      8  end;
      9  /
     
    32767
     
    PL/SQL procedure successfully completed
      

  7.   

    书上是 如各位那么写的,但是好像 在表里面 varchar2(4000) 但是存储过程中 做为参数就不一样了吧。。你们没有一个试试我写的那个 看你门运行报错不。。愁人!