执行查询时:
select count(age) from persons where age > 100;
将所有行聚合为一行。
当您这样做时:
select agetest from persons;
您没有执行第一个查询,因为
agetest
是一个标量函数(而不是聚合函数),并且您正在有效执行:
SELECT (select count(age) from persons where age > 100) FROM persons;
也就是说,对于
persons
执行所述子查询;这就是为什么为每个人重复函数的返回值,并且输出为:
|
(SELECTCOUNT(年龄)FROMPERSONSHOREAGE>100)
|
|
3.
|
|
3.
|
|
3.
|
|
3.
|
|
3.
|
|
3.
|
|
3.
|
|
3.
|
如果您想获得一次函数值,那么使用只有一行的表(例如
DUAL
):
SELECT agetest FROM dual;
或者,您可以将函数从标量函数更改为用户定义的聚合函数:
CREATE OR REPLACE TYPE CountGreaterThan100Type AS OBJECT(
cnt NUMBER(10,0),
STATIC FUNCTION ODCIAggregateInitialize(
ctx IN OUT CountGreaterThan100Type
) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(
self IN OUT CountGreaterThan100Type,
value IN NUMBER
) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(
self IN OUT CountGreaterThan100Type,
returnValue OUT NUMBER,
flags IN NUMBER
) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(
self IN OUT CountGreaterThan100Type,
ctx IN OUT CountGreaterThan100Type
) RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY CountGreaterThan100Type
IS
STATIC FUNCTION ODCIAggregateInitialize(
ctx IN OUT CountGreaterThan100Type
) RETURN NUMBER
IS
BEGIN
ctx := CountGreaterThan100Type( 0 );
RETURN ODCIConst.SUCCESS;
END;
MEMBER FUNCTION ODCIAggregateIterate(
self IN OUT CountGreaterThan100Type,
value IN NUMBER
) RETURN NUMBER
IS
BEGIN
IF value > 100 THEN
self.cnt := self.cnt + 1;
END IF;
RETURN ODCIConst.SUCCESS;
END;
MEMBER FUNCTION ODCIAggregateTerminate(
self IN OUT CountGreaterThan100Type,
returnValue OUT NUMBER,
flags IN NUMBER
) RETURN NUMBER
IS
BEGIN
returnValue := self.cnt;
RETURN ODCIConst.SUCCESS;
END;
MEMBER FUNCTION ODCIAggregateMerge(
self IN OUT CountGreaterThan100Type,
ctx IN OUT CountGreaterThan100Type
) RETURN NUMBER
IS
BEGIN
self.cnt := self.cnt + ctx.cnt;
RETURN ODCIConst.SUCCESS;
END;
END;
/
CREATE FUNCTION CountGreaterThan100( value NUMBER )
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING CountGreaterThan100Type;
/
然后:
SELECT CountGreaterThan100(age) FROM persons;
输出:
fiddle