3
由于Oracle manual说如何实施Oracle用户定义的聚合函数在Java中
您可以通过实现统称为ODCIAggregate程序例程的一组 创建用户定义的聚合函数。您可以使用 将这些例程作为对象类型中的方法实现,因此可以使用Oracle支持的任何语言,PL/SQL,C,或Java。
没有其他信息如何实现它。我发现在C/C++
中实现此示例任何人都知道如何使用Java来完成此操作?任何信息都会很棒。
由于Oracle manual说如何实施Oracle用户定义的聚合函数在Java中
您可以通过实现统称为ODCIAggregate程序例程的一组 创建用户定义的聚合函数。您可以使用 将这些例程作为对象类型中的方法实现,因此可以使用Oracle支持的任何语言,PL/SQL,C,或Java。
没有其他信息如何实现它。我发现在C/C++
中实现此示例任何人都知道如何使用Java来完成此操作?任何信息都会很棒。
是的,Oracle集合函数的Java实现确实是可能的。 使能诀窍是不使用Java实现的 的,但可以定义的Java类上方的PL/SQL包装包并且在TYPE实现中使用的 PL/SQL函数。
非常简单的实现基于Java的聚合函数Hello World
- 聚合函数总是返回一个 字符串“Hello World”。
Java类使几乎没有什么只返回在ODCITerminate
函数字符串“Hello World”。
基于Java的集合函数的任何实际实现都需要设置一个上下文类并将其传递给每个迭代方法。
的Java类
Create or Replace AND RESOLVE Java Source Named "JAggrFun" As
import java.math.BigDecimal;
class JAggrFun {
/*
Supporting Java class for dummy aggregate function
Implemented methods:
initiate - dummy
iterate - dummy
terminate - return "Hello World"
merge (is not required)
*/
final static BigDecimal SUCCESS = new BigDecimal(0);
final static BigDecimal ERROR = new BigDecimal(1);
static public BigDecimal ODCIInitialize(BigDecimal[] sctx) {
return SUCCESS;
}
static public BigDecimal ODCIIterate(BigDecimal ctx, String str) {
return SUCCESS;
}
static public BigDecimal ODCITerminate(BigDecimal ctx, String[] str) {
str[0] = "Hello World";
return SUCCESS;
}
}
/
的Java方法包装纸包
create or replace
PACKAGE JAggrFunPackage authid current_user AS
FUNCTION ODCIInitialize(
ctx OUT NOCOPY NUMBER
) RETURN NUMBER
AS LANGUAGE JAVA
NAME 'JAggrFun.ODCIInitialize(
java.math.BigDecimal[]) return java.math.BigDecimal';
FUNCTION ODCIIterate(
ctx IN NUMBER,
str VARCHAR2) RETURN NUMBER
AS LANGUAGE JAVA
NAME 'JAggrFun.ODCIIterate(
java.math.BigDecimal,
java.lang.String) return java.math.BigDecimal';
FUNCTION ODCITerminate(
ctx IN NUMBER,
str OUT VARCHAR2) RETURN NUMBER
AS LANGUAGE JAVA
NAME 'JAggrFun.ODCITerminate(
java.math.BigDecimal,
java.lang.String[]) return java.math.BigDecimal';
END JAggrFunPackage;
/
类型
CREATE OR REPLACE
TYPE JAggrFunPackageType authid current_user AS OBJECT
(
jctx NUMBER, -- stored context; not used in dummy implementation
STATIC FUNCTION
ODCIAggregateInitialize(sctx IN OUT NOCOPY JAggrFunPackageType)
RETURN NUMBER,
MEMBER FUNCTION
ODCIAggregateIterate(self IN OUT NOCOPY JAggrFunPackageType,
VALUE IN VARCHAR2)
RETURN NUMBER,
MEMBER FUNCTION
ODCIAggregateTerminate(self IN JAggrFunPackageType,
returnValue OUT NOCOPY VARCHAR2,
flags IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION
ODCIAggregateMerge(self IN OUT NOCOPY JAggrFunPackageType,
ctx IN JAggrFunPackageType)
RETURN NUMBER
);
/
聚合函数
CREATE OR REPLACE
FUNCTION JAggr(input VARCHAR2)
RETURN VARCHAR2
AGGREGATE USING JAggrFunPackageType;
/
类型主体
create or replace
type body JAggrFunPackageType is
static function ODCIAggregateInitialize(sctx IN OUT NOCOPY JAggrFunPackageType)
return number
is
begin
sctx := JAggrFunPackageType(null);
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT NOCOPY JAggrFunPackageType,
value IN varchar2)
return number
is
status NUMBER;
begin
if self.jctx is null then
status := JAggrFunPackage.ODCIInitialize(self.jctx);
if (status <> ODCIConst.Success) then
return status;
end if;
end if;
status := JAggrFunPackage.ODCIIterate(jctx,value);
return status;
end;
member function ODCIAggregateTerminate(self IN JAggrFunPackageType,
returnValue OUT NOCOPY VARCHAR2,
flags IN number)
return number
is
begin
return JAggrFunPackage.ODCITerminate(jctx, returnValue);
end;
member function ODCIAggregateMerge(self IN OUT NOCOPY JAggrFunPackageType,
ctx IN JAggrFunPackageType)
return number
is
begin
return ODCIConst.Success;
end;
end;
/
测试
select JAggr(dummy) from dual;
JAGGR(DUMMY)
-------------
Hello World
你需要看看[数据磁带盒开发人员指南(https://开头的文档。 oracle.com/cd/E16338_01/appdev.112/e10765/introduction.htm#ADDCI110),特别是关于“Implem在C,C++和Java中引入数据盒式磁带“和”用户定义的聚集函数接口“。祝你好运。 –
看到这个答案:http:// stackoverflow。com/questions/38217040/need-help-for-performing-below-calculation/38219279#38219279有一个用户定义的聚合函数那里的例子。 – krokodilko
显然,聚合函数的Java实现不是很常见的方法(基于答案的数量和延迟)。无论如何,可以找到一个坚实的例子[这里](http://dbprism.cvs.sourceforge.net/viewvc/dbprism/odi/db/CreateAggregateFunction.sql?revision=1.1.1.1&view=markup) –