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) –