2010-11-30 4 views
3

Oracle에서 사용자 정의 집계 함수를 작성하고이 함수를 패키지 내의 다른 일부 기능과 함께 그룹화하려고합니다. 예를 들어 (내가 가지고있는 문제를 시뮬레이션) 숫자의 합이 보이는 할 내 사용자 지정 집계를 가정 같은 :패키지 내부의 사용자 정의 집계 함수

CREATE OR REPLACE TYPE SUM_AGGREGATOR_TYPE AS OBJECT (
    summation NUMBER, 

    STATIC FUNCTION ODCIAggregateInitialize(agg_context IN OUT 
     SUM_AGGREGATOR_TYPE) RETURN NUMBER, 

    MEMBER FUNCTION ODCIAggregateIterate(self IN OUT SUM_AGGREGATOR_TYPE, 
     next_number IN NUMBER) RETURN NUMBER, 

    MEMBER FUNCTION ODCIAggregateMerge(self IN OUT SUM_AGGREGATOR_TYPE, 
     para_context IN SUM_AGGREGATOR_TYPE) RETURN NUMBER, 

    MEMBER FUNCTION ODCIAggregateTerminate(self IN SUM_AGGREGATOR_TYPE, 
     return_value OUT NUMBER, flags IN NUMBER) RETURN NUMBER 
); 

CREATE OR REPLACE TYPE BODY SUM_AGGREGATOR_TYPE IS 

    STATIC FUNCTION ODCIAggregateInitialize(agg_context IN OUT 
    SUM_AGGREGATOR_TYPE) 
     RETURN NUMBER IS 
    BEGIN 
    agg_context := SUM_AGGREGATOR_TYPE(NULL); 
    RETURN ODCIConst.Success; 
    END; 


    MEMBER FUNCTION ODCIAggregateIterate(self IN OUT SUM_AGGREGATOR_TYPE, 
    next_number IN NUMBER) 
     RETURN NUMBER IS 
    BEGIN 
    IF self.summation IS NULL THEN 
     self.summation := next_number; 
    ELSIF summation IS NOT NULL THEN 
     self.summation := self.summation + next_number; 
    END IF; 
    RETURN ODCIConst.Success; 
    END; 

    MEMBER FUNCTION ODCIAggregateMerge(self IN OUT SUM_AGGREGATOR_TYPE, 
    para_context IN SUM_AGGREGATOR_TYPE) 
     RETURN NUMBER IS 
    BEGIN 
    self.summation := self.summation + para_context.summation; 
    RETURN ODCIConst.Success; 
    END; 

    MEMBER FUNCTION ODCIAggregateTerminate(self IN SUM_AGGREGATOR_TYPE, 
    return_value OUT NUMBER, flags IN NUMBER) 
     RETURN NUMBER IS 
    BEGIN 
    return_value := self.summation; 
    return ODCIConst.Success; 
    END; 

END; 

나는 다음과 같은 함수 정의를 작성하는 경우 :

CREATE OR REPLACE FUNCTION MY_SUM(input NUMBER) 
    RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE; 

및 해당 유형 선언 테스트 :

CREATE OR REPLACE TYPE VECTOR 
IS 
    TABLE OF NUMBER; 

이 성명 :

CREATE OR REPLACE PACKAGE MY_FUNCTIONS AS 
    FUNCTION MY_SUM(input NUMBER) 
    RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE; 
END; 

과 통해 호출 :와

select MY_FUNCTIONS.my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1)); 

폭발

select my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1)); 

함수 정의와 패키지를 생성 단 (70)의 정확한 결과를 얻을

ORA-00600: internal error code, arguments: [17090], [], [], [], [], [], [], [], [], [], [], [] 

사용자 정의 집계 함수를 패키지 선언 내에 중첩시킬 수 있습니까?

+1

'ORA-00600'은 일반적으로 예상치 못한 기능 조합으로 인해 Oracle 버그를 나타냅니다. 정확한 오라클 버전은 무엇입니까? –

+0

Oracle 11g Release 2 (11.2.0.1.0)를 사용하고 있습니다. – wcmatthysen

+0

이 호에 어떤 소식이 있습니까? 나는 문제가 있지만, 나의 경우에는 연결이'ORA-03113 : 통신 채널에서 파일 끝 '으로 중단된다. 나는 이것이'ORA-00600'보다 더 나쁜 것 같아요. 'SELECT * FROM ALL_PROCEDURES'을 체크하면, 사용자 정의 집계가 올바르게 생성되고 등록되었음을 알 수 있습니다 ... –

답변

7

오라클은 ORA-00600을 사용하여 처리되지 않은 예외 (즉, 버그)를 알립니다. 첫 번째 인수는 예외를 나타냅니다. ORA-17090은 일반적인 "작동이 허용되지 않음"입니다. 자주 데이터베이스 버전 및 OS 플랫폼의 특정 순열로 제한됩니다. 다른 때는 우리가 정말 이상한 일을한다는 것을 의미합니다.

패키지 내에 사용자 지정 집계 함수를 포함시키는 것이 "정말 이상한"것으로 간주합니까? 확실하지 않다. 확실하게 우리는 데이터 카트리지 기능을 PL/SQL 기능에 포함시킬 수 있습니다. 그러나 사용자 정의 집계는 ODCI의 특별한 경우입니다. 문서에는 패키지에 대한 명시적인 규칙이 없지만 모든 예제에서는 CREATE FUNCTION을 사용하여 집계를 구현합니다.

그럼, 어떻게해야합니까? ORA-00600 메시지는 패치가 필요하기 때문에 Oracle Support의 개입이 필요합니다. 지원 계정이있는 경우 find out more about this particular issue here 수 있습니다. 추가 해결책을 얻으려면 iTAR을 준비해야합니다. 그렇지 않으면 아마 네가 운이 좋지 않을까 걱정된다.

+0

이상하게도 지원되지 않습니다. 오라클 포럼에 게시하여 그들이 말하는 것을 확인하겠습니다. – wcmatthysen

+0

Oracle 포럼 게시판을 만들었습니다. http://forums.oracle.com/forums/thread.jspa?threadID=2137501&tstart=0 그래야 오라클 직원이 후속 조치를 취할 수 있습니다. – wcmatthysen

+1

질문 [내가 여기] (http://stackoverflow.com/questions/18215415/how-to-debug-a-user-defined-aggregate-function-in-oracle-11g) 질문에 따라 사용자가 정의 된 집계 함수는 함수 만 작성할 때 작동하지만 패키지 내부에서는 작동하지 않습니다. 내 경우에는 (~ 3 년 후), 오류는 없지만 잘못된 결과를 반환합니다. 그래서 나 같은 다른 사람에게이 질문이 생깁니다. 사용자 정의 집계 함수가 패키지에서 작동하지 않으면 함수 만 사용해보십시오. – Lawtonfogle