在我的应用程序之一中。我们有一个查询,实际上我们正在调用一个函数,并且函数将 o/p 作为字符串返回。有人知道如何从返回的函数中获取子字符串吗?
我正在这样使用
select substr(myfunction(),0,4000) from dual.
我遇到了以下问题。
ORA-06502: PL/SQL: 数字或值错误: 字符串缓冲区太小。
请帮我 。提前致谢。
由于您正在应用 a substr
,因此您的函数返回的值可能大于 4000 个字符。如果是这种情况,那么你会从 SQL 中得到这个错误,你无法避免它。它试图将长字符串值分配给(隐式) SQL 级别varchar2
,当然也不能超过 4000 个字符,然后再将其传递给substr
函数。
您必须在substr
函数的返回值中添加需要。
用一个虚拟函数来演示(低效!)创建一个大字符串:
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;
/
这很好,因为函数的输出不超过 SQLvarchar2
大小:
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
Most probably you are trying to store more characters than is allowed in one of the variables that you use in your function. See: PL/SQL: numeric or value error: character string buffer too small %ROWTYPE
Simplest example:
DECLARE
v_varchar2_test VARCHAR2(5);
BEGIN
v_varchar2_test := '123456';
END;
And the error is, like in your case, ORA-06502.
确保函数返回的值类型正确;我刚刚尝试过这样的:
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;
它奏效了。