版权声明:本文为博主原创文章,未经博主允许不得转载。 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;