2016-11-29 47 views
3

由于Oracle manual如何实施Oracle用户定义的聚合函数在Java中

您可以通过实现统称为ODCIAggregate程序例程的一组 创建用户定义的聚合函数。您可以使用 将这些例程作为对象类型中的方法实现,因此可以使用Oracle支持的任何语言,PL/SQL,C,或Java

没有其他信息如何实现它。我发现在C/C++

中实现此示例任何人都知道如何使用Java来完成此操作?任何信息都会很棒。

+0

你需要看看[数据磁带盒开发人员指南(https://开头的文档。 oracle.com/cd/E16338_01/appdev.112/e10765/introduction.htm#ADDCI110),特别是关于“Implem在C,C++和Java中引入数据盒式磁带“和”用户定义的聚集函数接口“。祝你好运。 –

+0

看到这个答案:http:// stackoverflow。com/questions/38217040/need-help-for-performing-below-calculation/38219279#38219279有一个用户定义的聚合函数那里的例子。 – krokodilko

+0

显然,聚合函数的Java实现不是很常见的方法(基于答案的数量和延迟)。无论如何,可以找到一个坚实的例子[这里](http://dbprism.cvs.sourceforge.net/viewvc/dbprism/odi/db/CreateAggregateFunction.sql?revision=1.1.1.1&view=markup) –

回答

0

是的,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 
相关问题