기본적으로 저는 인터넷 및 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이있다 놓친거야?
조언을 주셔서 감사합니다. 두 초기화 값을 전달한다 입력 total
및 l_delimiter
가 해당 오브젝트 데이터의 인스턴스를 초기화가 그런데 CLOB
데이터 형으로 후자 이유 없으므로 :
재미있게 충분히, 방금이 사실을 알았습니다. 어쨌든 고마워. – AndyPC