美创科技技术社区

注册

 

发新话题 回复该主题

pl/sql中隐式转换导致出现数值或值错误 [复制链接]

1#

环境:


create table t(id clob);
    create table t1(id number);
    insert into t1 values(1);
    commit;
    块:


declare
    A CLOB;
    B NUMBER;
    begin
      SELECT ID INTO B FROM t1 T  ;
      FOR I IN 1..3000 LOOP
        A:=A||'A'||B ;
        END LOOP;
        INSERT INTO T VALUES(A);
        COMMIT;
      end;
    在以上块中,’A‘和b会进行隐式转换,默认会转换城char,而char在pl/sql中最长的长度为32767,超过是不允许的,定义之后执行会出错。运行之后不会出错。


当loop之后长度超过32767之后,隐式转换的问题出现了。默认转换成char,但是超过了char的最长长度,就报错了,即使你前面a定义为clob,因为clob和number不能进行隐式转换。块如下:


declare
    A CLOB;
    B NUMBER;
    begin
      SELECT ID INTO B FROM t1 T  ;
      FOR I IN 1..33000 LOOP
        A:=A||'A'||B ;
        END LOOP;
        INSERT INTO T VALUES(A);
        COMMIT;
      end;
    解决方法就是为number字段进行to_clob显示转换,这样就会避免因为隐式不能转换导致出错了。块如下:


declare
    A CLOB;
    B NUMBER;
    begin
      SELECT ID INTO B FROM t1 T  ;
      FOR I IN 1..33000 LOOP
        A:=A||'A'||to_clob(B) ;
        END LOOP;
        INSERT INTO T VALUES(A);
        COMMIT;
      end;
    通常数据类型之间的隐式转换忽略的情况较多,一开始基本能找出一些问题,当积累了一定数据量时(数据比较杂了)就有可能出现类似以上的问题。所以在字符串拼接时最好进行显示转换。避免出现隐式转换问题。

分享 转发
TOP
发新话题 回复该主题