oracle消除重复的行使用的什么函数,消除ListAgg(Oracle)中的重复项

CREATETYPE LISTAGG_DISTINCT_PARAMSASOBJECT(ELEMENTO VARCHAR2(2000),SEPARATORE VARCHAR2(10));CREATETYPE T_LISTA_ELEMENTIASTABLEOFVARCHAR2(2000);CREATETYPE T_LISTAGG_DISTINCTASOBJECT(LISTA_ELEMENTI T_LISTA_ELEMENTI,SEPARATORE VARCHAR2(10),STATICFUNCTIONODCIAGGREGATEINITIALIZE(SCTXINOUT T_LISTAGG_DISTINCT)RETURNNUMBER,MEMBERFUNCTIONODCIAGGREGATEITERATE(SELFINOUT T_LISTAGG_DISTINCT,VALUEINLISTAGG_DISTINCT_PARAMS)RETURNNUMBER,MEMBERFUNCTIONODCIAGGREGATETERMINATE(SELFINT_LISTAGG_DISTINCT,RETURN_VALUE OUT VARCHAR2,FLAGSINNUMBER)RETURNNUMBER,MEMBERFUNCTIONODCIAGGREGATEMERGE(SELFINOUT T_LISTAGG_DISTINCT,CTX2INT_LISTAGG_DISTINCT)RETURNNUMBER);CREATEORREPLACE TYPE BODY T_LISTAGG_DISTINCTISSTATICFUNCTIONODCIAGGREGATEINITIALIZE(SCTXINOUT T_LISTAGG_DISTINCT)RETURNNUMBERISBEGINSCTX:=T_LISTAGG_DISTINCT(T_LISTA_ELEMENTI(),',');RETURNODCICONST.SUCCESS;END;MEMBERFUNCTIONODCIAGGREGATEITERATE(SELFINOUT T_LISTAGG_DISTINCT,VALUEINLISTAGG_DISTINCT_PARAMS)RETURNNUMBERISBEGINIFVALUE.ELEMENTOISNOTNULLTHENSELF.LISTA_ELEMENTI.EXTEND;SELF.LISTA_ELEMENTI(SELF.LISTA_ELEMENTI.LAST):=TO_CHAR(VALUE.ELEMENTO);SELF.LISTA_ELEMENTI:=SELF.LISTA_ELEMENTI MULTISETUNIONDISTINCTSELF.LISTA_ELEMENTI;SELF.SEPARATORE:=VALUE.SEPARATORE;ENDIF;RETURNODCICONST.SUCCESS;END;MEMBERFUNCTIONODCIAGGREGATETERMINATE(SELFINT_LISTAGG_DISTINCT,RETURN_VALUE OUT VARCHAR2,FLAGSINNUMBER)RETURNNUMBERISSTRINGA_OUTPUT CLOB:='';LISTA_OUTPUT T_LISTA_ELEMENTI;TERMINATORE VARCHAR2(3):='...';LUNGHEZZA_MAX NUMBER:=4000;BEGINIFSELF.LISTA_ELEMENTI.EXISTS(1)THEN-- se esiste almeno un elemento nella lista-- inizializza una nuova lista di appoggioLISTA_OUTPUT:=T_LISTA_ELEMENTI();-- riversamento dei soli elementi in DISTINCTLISTA_OUTPUT:=SELF.LISTA_ELEMENTI MULTISETUNIONDISTINCTSELF.LISTA_ELEMENTI;-- ordinamento degli elementiSELECTCAST(MULTISET(SELECT*FROMTABLE(LISTA_OUTPUT)ORDERBY1)AST_LISTA_ELEMENTI)INTOLISTA_OUTPUTFROMDUAL;-- concatenazione in una stringaFORIINLISTA_OUTPUT.FIRST..LISTA_OUTPUT.LAST-1LOOP

STRINGA_OUTPUT:=STRINGA_OUTPUT||LISTA_OUTPUT(I)||SELF.SEPARATORE;ENDLOOP;STRINGA_OUTPUT:=STRINGA_OUTPUT||LISTA_OUTPUT(LISTA_OUTPUT.LAST);-- se la stringa supera la dimensione massima impostata, tronca e termina con un terminatoreIFLENGTH(STRINGA_OUTPUT)>LUNGHEZZA_MAXTHENRETURN_VALUE:=SUBSTR(STRINGA_OUTPUT,0,LUNGHEZZA_MAX-LENGTH(TERMINATORE))||TERMINATORE;ELSERETURN_VALUE:=STRINGA_OUTPUT;ENDIF;ELSE-- se non esiste nessun elemento, restituisci NULLRETURN_VALUE:=NULL;ENDIF;RETURNODCICONST.SUCCESS;END;MEMBERFUNCTIONODCIAGGREGATEMERGE(SELFINOUT T_LISTAGG_DISTINCT,CTX2INT_LISTAGG_DISTINCT)RETURNNUMBERISBEGINRETURNODCICONST.SUCCESS;END;END;-- fine corpoCREATEFUNCTIONLISTAGG_DISTINCT(INPUT LISTAGG_DISTINCT_PARAMS)RETURNVARCHAR2

PARALLEL_ENABLE AGGREGATEUSINGT_LISTAGG_DISTINCT;//ExampleSELECTLISTAGG_DISTINCT(LISTAGG_DISTINCT_PARAMS(OWNER,', '))ASLISTA_OWNERFROMSYS.ALL_OBJECTS;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值