关于Oracle数据库中字符串大小限制4000的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ytfy12/article/details/85390859

参考:https://blog.csdn.net/tswisdom/article/details/7314576

昨天出现了一例,伯俊系统与小程序会员接口之间,获取不到优惠卷的问题。

好在接口是存储过程,其他的不会。

xcx_getvipjuan

调试后,出现了 ORA-06052:PL/SQL :数据字或值错误:字符串缓冲区太小

看起来很简单,是变量或者字段长度不够嘛。听指点,临时使用限制查询返回行数限制,就不报错了。

今天仔细查看程序,发现2个变量与对应的表字段大小不匹配。改得和字段一样大,调试无问题,以为解决了。

结果中午的时候,反馈还是有问题。再次调试,仍旧报之前的错误,问题没解决。

耐心调试后,发现函数return的时候报错了。原因是函数的返回值和字段一样,不可以超过4000
 

CREATE OR REPLACE FUNCTION xcx_getvipjuan(P_QUERY IN VARCHAR2) RETURN VARCHAR2 AS

 ret VARCHAR2(32000);
 JO              JSON;

begin
 jo      := json(P_QUERY);
 --给jo的字段赋值,并且是多行
 ret := jo.to_char(FALSE);
 RETURN ret
end;

我的总结

--超过不报错,但限制4k
select rpad('a', 32768, 'b'),length(rpad('a', 32768, 'b')) from dual;

--可以超过,但限制32767
begin
 dbms_output.put_line(length(rpad('a', 32767, 'b')));
end;

--变量可以超过,编译正常,运行到返回值是报错:ORA-06502
create or replace function funny return VARCHAR2 is
  v_ret varchar2(32767);
BEGIN
    v_ret := rpad('a', 4001, 'b');
    return v_yct;
end;

猜你喜欢

转载自blog.csdn.net/ytfy12/article/details/85390859