在我的应用程序中。我们有一个查询,其中我们正在调用一个函数,函数将o / p作为String返回。任何人都知道如何从函数返回o / p?
获取子串我正在使用这个
select substr(myfunction(),0,4000) from dual.
我遇到了问题。
ORA-06502:PL / SQL:数字或值错误:字符串缓冲区也是如此 小。
请帮帮我。在此先感谢。
答案 0 :(得分:2)
由于您正在应用substr
,因此您的函数返回的值大概超过4000个字符。如果是这种情况,那么你将从SQL中得到这个错误,你无法避免它。它试图将长字符串值分配给(隐式)SQL级varchar2
,当然也不能超过4000个字符,然后再传递给substr
函数。
您必须将substr
添加到函数的返回中,或者如果有时从某个可以处理long值的地方调用它,则可以使用仅返回前4000个字符的包装函数 - 所以你可以根据需要获得适当的值。
使用虚函数演示(效率低!)创建一个大字符串:
create or replace function myfunction(strlen number) return varchar2 is
str varchar2(32767) := 'X';
begin
while length(str) < least(strlen, 32767) loop
str := str || 'X';
end loop;
return str;
end myfunction;
/
这很好,因为函数的输出不超过SQL varchar2
大小:
select length(substr(myfunction(4000),0,4000)) from dual;
LENGTH(SUBSTR(MYFUNCTION(4000),0,4000))
---------------------------------------
4000
但是这会导致你的错误,因为函数的输出太长了:
select length(substr(myfunction(4001),0,4000)) from dual;
SQL Error: ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "STACKOVERFLOW.MYFUNCTION", line 7
06502. 00000 - "PL/SQL: numeric or value error%s"
使用简单的包装函数作为解决方法:
create or replace function trunc_myfunction(strlen number) return varchar2 is
begin
return substr(myfunction(strlen), 0, 4000);
end;
/
select length(substr(trunc_myfunction(4000),0,4000)) from dual;
LENGTH(SUBSTR(TRUNC_MYFUNCTION(4000),0,4000))
---------------------------------------------
4000
select length(substr(trunc_myfunction(4001),0,4000)) from dual;
LENGTH(SUBSTR(TRUNC_MYFUNCTION(4001),0,4000))
---------------------------------------------
4000
select length(substr(trunc_myfunction(32767),0,4000)) from dual;
LENGTH(SUBSTR(TRUNC_MYFUNCTION(32767),0,4000))
----------------------------------------------
4000
答案 1 :(得分:1)
很可能您尝试存储的字符多于您在函数中使用的某个变量中允许的字符数。请参阅:PL/SQL: numeric or value error: character string buffer too small %ROWTYPE
最简单的例子:
DECLARE
v_varchar2_test VARCHAR2(5);
BEGIN
v_varchar2_test := '123456';
END;
错误就像你的情况一样,ORA-06502。
答案 2 :(得分:0)
确保函数返回的值的类型正确; 我刚试过这样的话:
create or replace
FUNCTION MONTH
(DATA IN DATE)
RETURN VARCHAR IS
BEGIN
RETURN TO_CHAR(DATA, 'MM');
END;
和电话:
SELECT substr(MONTH(SYSDATE),0,1) FROM DUAL;
并且有效。