Да, возможна реализация Java-функции агрегации Oracle. Благоприятные трюк не использовать реализацию Java в качестве ORACLE TYPE
но определить оболочку пакета PL/SQL выше класса Java и использовать ФУНКЦИИ PL/SQL в реализации TYPE.
Очень простая реализация функции агрегации на основе Java Hello World
: функция агрегата всегда возвращает строку «Hello World».
Класс Java почти ничего не возвращает только в функции ODCITerminate
строку «Hello World».
Любая практическая реализация агрегированной функции на основе Java должна будет настроить класс контекста и передать его каждому методу итерации.
Java Class
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
Вы должны смотреть на [Data Cartridge Разработчики Руководство] (https: // Docs. oracle.com/cd/E16338_01/appdev.112/e10765/introduction.htm#ADDCI110), в частности главы «Implem ввода картриджей данных на языках C, C++ и Java »и« Пользовательский интерфейс сопряженных функций ». Удачи. –
См. Этот ответ: http: // stackoverflow.com/questions/38217040/need-help-for-perform-below-calculate/38219279 # 38219279 Существует пример пользовательского агрегатного функционала. – krokodilko
По-видимому, реализация Java-функции агрегата не является очень распространенным подходом (основанным на числе и задержке ответов). В любом случае можно найти твердый пример [здесь] (http://dbprism.cvs.sourceforge.net/viewvc/dbprism/odi/db/CreateAggregateFunction.sql?revision=1.1.1.1&view=markup) –