2016-11-29 81 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 
相關問題