Monday, 3 March 2014

STRING_AGG

                                                             REGEXP_SUBSTR

/* Formatted on 2015/03/23 18:14 (Formatter Plus v4.8.8) */
CREATE OR REPLACE TYPE t_string_agg AS OBJECT (
   g_string   VARCHAR2 (32767),
   STATIC FUNCTION odciaggregateinitialize (sctx IN OUT t_string_agg)
      RETURN NUMBER,
   MEMBER FUNCTION odciaggregateiterate (
      SELF    IN OUT   t_string_agg,
      VALUE   IN       VARCHAR2
   )
      RETURN NUMBER,
   MEMBER FUNCTION odciaggregateterminate (
      SELF          IN       t_string_agg,
      returnvalue   OUT      VARCHAR2,
      flags         IN       NUMBER
   )
      RETURN NUMBER,
   MEMBER FUNCTION odciaggregatemerge (
      SELF   IN OUT   t_string_agg,
      ctx2   IN       t_string_agg
   )
      RETURN NUMBER
);
/



CREATE OR REPLACE TYPE BODY t_string_agg
IS
   STATIC FUNCTION odciaggregateinitialize (sctx IN OUT t_string_agg)
      RETURN NUMBER
   IS
   BEGIN
      sctx := t_string_agg (NULL);
      RETURN odciconst.success;
   END;
   MEMBER FUNCTION odciaggregateiterate (
      SELF    IN OUT   t_string_agg,
      VALUE   IN       VARCHAR2
   )
      RETURN NUMBER
   IS
   BEGIN
      SELF.g_string := SELF.g_string || ',' || VALUE;
      RETURN odciconst.success;
   END;
   MEMBER FUNCTION odciaggregateterminate (
      SELF          IN       t_string_agg,
      returnvalue   OUT      VARCHAR2,
      flags         IN       NUMBER
   )
      RETURN NUMBER
   IS
   BEGIN
      returnvalue := RTRIM (LTRIM (SELF.g_string, ','), ',');
      RETURN odciconst.success;
   END;
   MEMBER FUNCTION odciaggregatemerge (
      SELF   IN OUT   t_string_agg,
      ctx2   IN       t_string_agg
   )
      RETURN NUMBER
   IS
   BEGIN
      SELF.g_string := SELF.g_string || ',' || ctx2.g_string;
      RETURN odciconst.success;
   END;
END;
/



CREATE OR REPLACE FUNCTION string_agg (p_input VARCHAR2)
RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING t_string_agg;

select string_agg(segment1) from po_distributions_v where PO_HEADER_ID =266266