Oracle 用户定义聚合函数 - 返回值错误 ORA-06502

问题描述 投票:0回答:1

我尝试定义一个用户定义的聚合函数,它接受一个数值并返回一个 VARCHAR2 类型的值。只要返回值不超过 40 个字符,它就可以完美运行。但是,我没有找到任何长度限制的参考,所以我有点困惑。 41 个字符并不算多,为什么这会成为问题呢?

要亲自尝试一下,这里是完整的测试代码。正如所写,它会产生错误 ORA-06502。如果把返回值中的x去掉就没有问题了

有什么想法吗?我想返回超过 40 个字符。

create or replace TYPE TEST_OBJ AS OBJECT
( -- Attribute
  ID       NUMBER, -- Eindeutige ID für jeden Aufruf
  -- Funktionen
  STATIC FUNCTION ODCIAggregateInitialize(ctx IN OUT TEST_OBJ)
     return number,
  MEMBER FUNCTION ODCIAggregateIterate(self IN OUT TEST_OBJ, VALUE IN NUMBER)
     return number,
  MEMBER FUNCTION ODCIAggregateMerge(self IN OUT TEST_OBJ, ctx2 IN TEST_OBJ)
     return number,
  MEMBER FUNCTION ODCIAggregateTerminate(self IN TEST_OBJ, ReturnValue OUT VARCHAR2, flags IN NUMBER)
     return number
);
/

create or replace type body TEST_OBJ is
STATIC FUNCTION ODCIAggregateInitialize(ctx IN OUT TEST_OBJ)
     return number is
BEGIN
  return ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateIterate(self IN OUT TEST_OBJ, VALUE IN NUMBER)
     return number is
BEGIN
  return ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateMerge(self IN OUT TEST_OBJ, ctx2 IN TEST_OBJ)
     return number is
BEGIN
  return ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateTerminate(self IN TEST_OBJ, ReturnValue OUT VARCHAR2, flags IN NUMBER)
     return number is
BEGIN
  ReturnValue :=  '0123456789012345678901234567890123456789x';
  return ODCIConst.Success;
END;
END;
/

create or replace FUNCTION TEST(input NUMBER) return NUMBER PARALLEL_ENABLE
   AGGREGATE USING TEST_OBJ;
/
oracle aggregate-functions
1个回答
0
投票

在最终函数中,您不会返回

NUMBER
,而必须是
VARCHAR2
(否则 Oracle 会尝试将返回值隐式转换回数字,并且
NUMBER
数据类型的最大精度为 38 -40 位)。

create or replace FUNCTION TEST(input NUMBER) return VARCHAR2 PARALLEL_ENABLE
   AGGREGATE USING TEST_OBJ;
/

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.