0

在我的应用程序之一中。我们有一个查询,实际上我们正在调用一个函数,并且函数将 o/p 作为字符串返回。有人知道如何从返回的函数中获取子字符串吗?

我正在这样使用

select substr(myfunction(),0,4000) from dual.

我遇到了以下问题。

ORA-06502: PL/SQL: 数字或值错误: 字符串缓冲区太小。

请帮我 。提前致谢。

4

3 回答 3

2

由于您正在应用 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 
于 2013-10-03T13:53:34.967 回答
1

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.

于 2013-10-03T13:18:35.333 回答
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;

它奏效了。

于 2013-10-03T13:25:43.733 回答