Oracle User-defined aggretate function -返回值,错误为ORA-06502

cs7cruho  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(117)

我试图定义一个用户定义的聚合函数,它接受一个数值并返回一个VARCHAR 2类型的值。只要返回值不超过40个字符,它就可以完美地工作。然而,我没有找到任何参考restictions的长度,所以我有点困惑。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;
/
kgsdhlau

kgsdhlau1#

在最后一个函数中,你没有返回一个NUMBER,它需要是VARCHAR2(否则Oracle将尝试隐式地将返回值转换为一个数字,而NUMBER数据类型的最大精度为38-40位)。

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

fiddle

相关问题