Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can Oracle';s用户定义的聚合函数是否定义为与两列一起使用?_Oracle - Fatal编程技术网

Can Oracle';s用户定义的聚合函数是否定义为与两列一起使用?

Can Oracle';s用户定义的聚合函数是否定义为与两列一起使用?,oracle,Oracle,我想实现一个定制的回归聚合函数,它类似于现有的REGR\u SLOPE 我想要定义的函数需要获得两列作为参数,例如 select T.EMPLOYEE_ID, CUSTOM_REGR_SLOPE(T.DATE, T.SALARY) as SALARY_TREND from (...) T group by T.EMPLOYEE_ID; 甲骨文的文档表明这可能是不可能的,但我可能不善于理解字里行间的意思;-) 我们使用Oracle 12。并不是说这不可能,而是说: 对使用骨料的限制

我想实现一个定制的回归聚合函数,它类似于现有的
REGR\u SLOPE

我想要定义的函数需要获得两列作为参数,例如

select 
   T.EMPLOYEE_ID,
   CUSTOM_REGR_SLOPE(T.DATE, T.SALARY) as SALARY_TREND
from (...) T
group by T.EMPLOYEE_ID;
甲骨文的文档表明这可能是不可能的,但我可能不善于理解字里行间的意思;-)

我们使用Oracle 12。

并不是说这不可能,而是说:

对使用骨料的限制
如果指定此子句,则只能为函数指定一个输入参数


正如其他人所指出的,一个输入参数可以是对象类型或集合等。;但是你不能像你所展示的那样简单地定义你自己调用的聚合函数,
CUSTOM\u REGR\u SLOPE(t.DATE,t.SALARY)

是的,如果你真的想/需要,这是可能的。您可以这样做:

首先,创建一个对象类型:

create or replace type two_nums_t as object
(
num1 number,
num2 number
);
然后创建自定义等级库:

CREATE OR REPLACE TYPE TotalSumPair
AS OBJECT (
runningSum1 number,
runningCnt1 number,
runningSum2 number,
runningCnt2 number,

STATIC FUNCTION ODCIAggregateInitialize
  ( actx IN OUT TotalSumPair
  ) RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateIterate
  ( self  IN OUT TotalSumPair,
    val   IN     two_nums_t
  ) RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateTerminate
  ( self             IN   TotalSumPair,
    returnValue  OUT  NUMBER, -- return 
    flags           IN   NUMBER
  ) RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateMerge
  (self  IN OUT TotalSumPair,
   ctx2 IN      TotalSumPair
  ) RETURN NUMBER
);
和海关机构:

CREATE OR REPLACE TYPE BODY TotalSumPair AS
STATIC FUNCTION ODCIAggregateInitialize
  ( actx IN OUT TotalSumPair
  ) RETURN NUMBER IS 
  BEGIN
    IF actx IS NULL THEN
      actx := TotalSumPair(0,0,0,0);
    ELSE
      actx.runningSum1 := 0;
      actx.runningCnt1 := 0;
      actx.runningSum2 := 0;
      actx.runningCnt2 := 0;
    END IF;
    RETURN ODCIConst.Success;
  END;

MEMBER FUNCTION ODCIAggregateIterate
  ( self  IN OUT TotalSumPair,
    val   IN     two_nums_t
  ) RETURN NUMBER IS
  BEGIN
    self.runningSum1 := self.runningSum1 + nvl(val.num1,0);
    self.runningSum2 := self.runningSum2 + nvl(val.num2,0);
    self.runningCnt1 := self.runningCnt1 + 1;
    self.runningCnt2 := self.runningCnt2 + 1;
    RETURN ODCIConst.Success;
  END;

MEMBER FUNCTION ODCIAggregateTerminate
  ( self        IN  TotalSumPair,
    ReturnValue OUT NUMBER,
    flags       IN  NUMBER
  ) RETURN NUMBER IS
  BEGIN
    --if (runningCnt1 <> 0) then
        returnValue := (self.runningSum1 + self.runningSum2);
    --else
    --    returnValue := self.runningSum1;
    --end if;
    RETURN ODCIConst.Success;
  END;

MEMBER FUNCTION ODCIAggregateMerge
  (self IN OUT TotalSumPair,
   ctx2 IN     TotalSumPair
  ) RETURN NUMBER IS
  BEGIN
    self.runningSum1 := self.runningSum1 + ctx2.runningSum1;
    self.runningCnt1 := self.runningCnt1 + ctx2.runningCnt1;
    self.runningSum2 := self.runningSum2 + ctx2.runningSum2;
    self.runningCnt2 := self.runningCnt2 + ctx2.runningCnt2;
    RETURN ODCIConst.Success;
  END;

END;
现在这样称呼它:

with x as (
 select 'X' as id, 1 as num1, 2 as num2 from dual
 union all
 select 'X' as id, 3 as num1, 4 as num2 from dual
 union all
 select 'Z' as id, 5 as num1, 6 as num2 from dual
)
select id, total_sum_pair(two_nums_t(num1, num2)) sum
from x
group by id;
输出:

ID  SUM
X   10
Z   11
这将对每个X行(1+2+3+4)和每个Y行(5+6)的数字求和


呸!;)

您询问是否可以定义一个函数,该函数接受两个可以从SQL调用的参数?@Boneist自定义聚合函数,从技术上讲,它是一个自定义类型;是的,你试过了吗?您可以从SQL中调用任意多个in参数的函数(当然,只要函数满足允许从SQL调用它的条件!)。下面是一个为间隔创建自定义聚合函数的方法,您可以使用它作为模板。google快速抛出,他定义了一条记录,你可以将它作为一个允许的参数传入。。。记录可以有多个字段。如果你在两个num中添加“map member function”,你可以用不同的statement调用它。
ID  SUM
X   10
Z   11