SQL:如何从sql中的函数输出中获取子串?

时间:2013-10-03 13:10:51

标签: sql oracle oracle10g

在我的应用程序中。我们有一个查询,其中我们正在调用一个函数,函数将o / p作为String返回。任何人都知道如何从函数返回o / p?

获取子串

我正在使用这个

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

我遇到了问题。

  

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

请帮帮我。在此先感谢。

3 个答案:

答案 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;

并且有效。