2016-11-29 3 views
3

Как Oracle manual говоритКак реализовать Oracle User-Defined агрегатные функции в Java

Вы можете создать определенную пользователем агрегатной функции по реализации комплекса подпрограмм, известных как ODCIAggregate подпрограмм. Вы можете реализовать эти процедуры как методы в типе объекта, поэтому реализация может быть на любом языке, поддерживаемом Oracle, PL/SQL, C, C++ или Java.

Нет другой информации, как ее реализовать. Я нашел пример реализации этого в

Кто-нибудь знает, как это сделать с помощью Java? Любая информация будет полезной.

+0

Вы должны смотреть на [Data Cartridge Разработчики Руководство] (https: // Docs. oracle.com/cd/E16338_01/appdev.112/e10765/introduction.htm#ADDCI110), в частности главы «Implem ввода картриджей данных на языках C, C++ и Java »и« Пользовательский интерфейс сопряженных функций ». Удачи. –

+0

См. Этот ответ: http: // stackoverflow.com/questions/38217040/need-help-for-perform-below-calculate/38219279 # 38219279 Существует пример пользовательского агрегатного функционала. – krokodilko

+0

По-видимому, реализация Java-функции агрегата не является очень распространенным подходом (основанным на числе и задержке ответов). В любом случае можно найти твердый пример [здесь] (http://dbprism.cvs.sourceforge.net/viewvc/dbprism/odi/db/CreateAggregateFunction.sql?revision=1.1.1.1&view=markup) –

ответ

0

Да, возможна реализация 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 
Смежные вопросы