2013-08-12 5 views
1

기본적으로 저는 인터넷 및 StackOverflow에서 이미 발견 한 것들을 다시 작성하고 있습니다.오라클에 사용자 지정 집계 함수를 작성하려고합니다.

내 목표는 COLLECT가 부적절하여 커스텀 집계 함수 (Oracle에서)를 작성하는 것입니다. (나는 커다란 문자열 4000 자 +를 다루고 있습니다.) 나는 WM_CONCAT에 대해 충분한 신뢰를 가지지 못합니다. 그것은 적절할 것입니다.

중첩 된 하위 쿼리에서 데이터를 JSON 문자열로 작성하고 개체를 빌드하는 데 가장 적합한 솔루션은 사용자 지정 집계 함수 인 것처럼 보이므로 값 사이에 구분 기호를 지정할 수 있어야합니다. 이것을 문맥으로. 그래서

Error(8,11): PLS-00306: wrong number or types of arguments in call to 'STRING_AGG_TYPE'

, 나는했습니다 분명 아무것도 :

CREATE OR REPLACE TYPE parms AS TABLE OF CLOB; 

CREATE OR REPLACE TYPE string_agg_TYPE AS OBJECT 
(
    total CLOB, 
    l_delimiter CLOB, 

    STATIC FUNCTION 
     ODCIAggregateInitialize(sctx IN OUT string_agg_TYPE) 
     RETURN NUMBER, 

    MEMBER FUNCTION 
     ODCIAggregateIterate(self IN OUT string_agg_TYPE , 
          value IN parms) 
     RETURN NUMBER, 

    MEMBER FUNCTION 
     ODCIAggregateTerminate(self IN string_agg_TYPE, 
          RETURNValue OUT CLOB, 
          flags IN NUMBER) 
     RETURN NUMBER, 

    MEMBER FUNCTION 
     ODCIAggregateMerge(self IN OUT string_agg_TYPE, 
         ctx2 IN string_agg_TYPE) 
     RETURN NUMBER 
); 

CREATE OR REPLACE TYPE body string_agg_TYPE 
IS 
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT string_agg_TYPE) 
RETURN NUMBER 
IS 
BEGIN 
    sctx := string_agg_TYPE(NULL); 
    RETURN ODCIConst.Success; 
END; 

MEMBER FUNCTION ODCIAggregateIterate(self IN OUT string_agg_TYPE, 
            value IN parms) 
RETURN NUMBER 
IS 
BEGIN 
    IF (value.count = 2) 
    THEN 
     self.l_delimiter := value(2); 
ELSE 
    self.l_delimiter := ','; 
    END IF; 
    self.total := self.total || self.l_delimiter || value(1); 
    RETURN ODCIConst.Success; 
END; 

MEMBER FUNCTION ODCIAggregateTerminate(self IN string_agg_TYPE, 
            RETURNValue OUT CLOB, 
            flags IN NUMBER) 
RETURN NUMBER 
IS 
BEGIN 
    RETURNValue := ltrim(self.total,self.l_delimiter); 
    RETURN ODCIConst.Success; 
END; 

MEMBER FUNCTION ODCIAggregateMerge(self IN OUT string_agg_TYPE, 
           ctx2 IN string_agg_TYPE) 
RETURN NUMBER 
IS 
BEGIN 
    self.total := self.total || ctx2.total; 
    RETURN ODCIConst.Success; 
END; 

END; 

내가 몸 정의를 컴파일하려고, 오라클은 나에게 다음과 같은 오류를 제공합니다 :

내가 가진 현재의 오라클 SQL이있다 놓친거야?

조언을 주셔서 감사합니다. 두 초기화 값을 전달한다 입력 totall_delimiter가 해당 오브젝트 데이터의 인스턴스를 초기화가 그런데 CLOB 데이터 형으로 후자 이유 없으므로 :

답변

2

개체 유형 string_agg_TYPE 두 특성을 갖는 생성자의 해당 속성에 대한 설명은 다음과 같습니다.

sctx := string_agg_TYPE(NULL, NULL); 
+0

재미있게 충분히, 방금이 사실을 알았습니다. 어쨌든 고마워. – AndyPC