XMLAgg function

Hi, I try to generate a XML with SQL. My sql sentence is following:
SELECT xmlelement("RAIZ", xmlelement("DATOS",
                    XMLAgg( xmlelement("GRUPO",
                    xmlattributes( G.VDESCRIPCION AS "NOMBRE" ),
                    XMLAgg( xmlelement("OPCION",
                    xmlattributes(O.VDESCRIPCION AS "NOMBRE", O.VFUNCION AS "URLO"),
                         XMLAgg(xmlelement("SUB",xmlattributes(S.VDESCRIPCION AS "NOMBRE", S.VFUNCION AS "URLO") )))) )     )) )
FROM AX_MENUPUNTO O, AX_MENUPUNTO S,
( SELECT *
FROM AX_MENUPUNTO
WHERE VCODPUNMENUPADRE IS NULL ) G
WHERE G.VCODPUNMENU = O.VCODPUNMENUPADRE (+)
AND O.VCODPUNMENU = S.VCODPUNMENUPADRE (+)
GROUP BY G.VCODPUNMENU, O.VCODPUNMENU, S.VCODPUNMENU,
G.VDESCRIPCION, O.VDESCRIPCION, S.VDESCRIPCION
When I post the XMLAgg function IN BOLD, appear me a message that says that is enougth deep level for XMLAgg.
Can anybody help me please??
Regards.

Hi,
This is my suggestion - use PL/SQL to slowly build up your XML Document. It's neat & helps to logically build your solution. Here's a sample :-
CREATE OR REPLACE FUNCTION GET_XML_DOCUMENT
RETURN XMLTYPE
AS
     ln_xml_retval     XMLTYPE;
     ln_sql_code     NUMBER;
BEGIN
     BEGIN
     SELECT
          XMLAGG(
               XMLELEMENT(
                        "SUB",
                         XMLATTRIBUTES(
                                      S.VDESCRIPCION AS "NOMBRE",
                                      S.VFUNCION AS "URLO"
        INTO
          ln_xml_retval
     FROM
          AX_MENUPUNTO S;
     EXCEPTION
          WHEN OTHERS THEN
               ln_sql_code:=SQLCODE;
               SELECT XMLELEMENT(ERROR,ln_sql_code) INTO ln_xml_retval FROM DUAL;
               RETURN ln_xml_retval;
     END;
     RETURN ln_xml_retval;
END GET_XML_DOCUMENT;Now, I can use my function like this :-
SELECT GET_XML_DOCUMENT FROM DUAL;I inserted these values into the Table:-
INSERT INTO AX_MENUPUNTO VALUES( 'A','A','A','A' );
INSERT INTO AX_MENUPUNTO VALUES( 'B','B','B','B' );
INSERT INTO AX_MENUPUNTO VALUES( 'C','C','C','C' );
COMMIT;And, this is what I get :-
SQL> SET LONG 1000;
SQL> SELECT GET_XML_DOCUMENT FROM DUAL;
GET_XML_DOCUMENT
<SUB NOMBRE="A" URLO="A"></SUB><SUB NOMBRE="B" URLO="B"></SUB><SUB NOMBRE="C" UR
LO="C"></SUB>This way, you can work up bits of your logic and assemble them together. Youc an also resue some of the functions in other functions... ( I usually work with XML this way - again, it's my personal choice...)...
I am still trying out your big Select statement in my Function - I'll let you know if I find something interesting. You might want to try the same.....
Regards,
Sandeep

Similar Messages

  • Error using SYS.XMLAGG function

    Error occurs while using SYS.XMLAGG function.What could be the cause ?
    I tried the below given SQL statement, it throws ORA-29913
    error.
    SELECT SYS_XMLAGG(SYS_XMLGEN(e.a)).getClobval() e FROM try_xmltype e
    ERROR:
    ORA-29913: error in executing ODCIAGGREGATEINITIALIZE callout

    What is the database version? You can post this in XMLDB forum for further support.

  • ODI inteface giving error on xmlagg function

    Hello,
    Oracle DB: 11g r2
    ODI :11.1.1.3
    I have this following code in SQL and needs to implement in ODI interface
    select  rtrim (xmlagg (xmlelement (e, CAT.CATEGORY || ',')).extract ('//text()'), ',') LEVEL_OF_DIFFICULTY from src_schema.category  cat,src_schema.item_category  icat  where  cat.pk=icat.category_pk 
    and icat.ASI_PK=E.PK AND CAT.MAIN_PK=E.MAIN_PK AND CAT.TYPE='D' )  LEVEL_OF_DIFFICULTY
    Note:_
    E alias will be from the base table that's from target data store
    I am trying to implement this in ODI as lookup, I have been getting this following error
    Caused By: java.sql.SQLSyntaxErrorException: ORA-00937: not a single-group group functionI have tried multiple option as source and staging area, both times i am getting this error
    If I put that in target then getting critical error.
    Could you please let me know how do I implement this in ODI interface
    Thanks,

    you're missing the group by.
    Also, is playdate a date datatype? If so, then you need to explicitly convert '1-jan-2007' into a date, otherwise you leave yourself open to a bug, should different NLS date settings be applied.
    Assuming a date datatype, try the following:
    SELECT pd.player_name, MAX(pd.wickets_taken)
    FROM   playerdetail pd, teamdetails td
    WHERE  pd.types = 'ODI'
    AND    td.playdate > to_date('01/01/2007', 'dd/mm/yyyy')
    --I suspect you're missing a join condition - something like pd.team_id = td.team_id
    GROUP BY pd.player_name;

  • How to use multiple xmlforest() function within xmlagg() function

    I need to create following XML structure by reading multiple tables from DB .
    The tables are relational and joined by keys.
    <Invoice>
    <CaseOrdrId>0000022359</CaseOrdrId>
    <Id>100065117</Id>
    <Prescription>
    <CaseOrdrItmId>0000005684</CaseOrdrItmId>
    <RxId>1104900686</RxId>
    <Prescriber>
         <CasePartyIdDEA>0000000000</CasePartyIdDEA>
         <CasePartyIdNPI>0000000000</CasePartyIdNPI>
         <CasePartyIdSLic>0000000000</CasePartyIdSLic>
         </Prescriber>
         <PatInfo>
              <CasePartyId>0000000000</CasePartyId>
              </PatInfo>
    </Prescription>
    </Invoice>
    <Invoice>
    <Invoice>
    <Invoice>
    <Invoice>
    <Invoice> tag can repeat 5times , So,I am using xmlagg().
    To create the tree structure within <Invoice> I am using multiple xmlforest().
    But getting error : SQL Error: ORA-06553: PLS-306: wrong number or types of arguments in call to 'SYS_IXMLAGG' . code added today marked in yellow.
    Any help on this would be really helpful.

    Hi , I could fix the previous issue with xmlagg().
    My query is as follows :
    select
    xmlelement( "Response", xmlforest( b.StatusCode as "StatusCode", b.StatusMessage as "StatusMessage",
    b.ServiceAction as "ServiceAction",
    select
    xmlforest( a.id as "Id", a.ExternalId as "ExternalId", a.Source as "Source", a.UserID as "UserID", xmlforest(b.id as
    "Id")"Note", xmlforest(
    select
    Xmlforest(P.Case_Party_Id As "CasePartyId",Xmlelement("CaseGeoAddrId",S.Address_Id )as "Address"
    from
    v44139.party p,
    v44139.patient_address s
    where
    p.case_party_id = s.case_party_id
    and p.party_id_type_cde = 'MBR'
    AND s.individual_agn_id = 0
    ) as "Membership")"Group",
    select
    xmlagg(xmlelement("Invoice",xmlelement( "CaseOrdrId",d.case_order_id),
    xmlelement("Id" ,d.invoice_nbr) ,xmlelement("Prescription",
    xmlforest(e.case_order_item_id as "CaseOrdrItmId", e.rx_nbr as "RxId"),
    xmlelement("Prescriber",
    xmlforest(169629 as "CasePartyIdDEA", 169630 as "CasePartyIdNPI",169631
    as "CasePartyIdSLic")),xmlelement("PatInfo",xmlforest(e.case_party_id as "CasePartyId") )) ) )
    --AS ID
    from
    v44139.patient_order d ,
    v44139.order_rx e
    where
    d.case_id = a.id
    and d.case_order_id = e.case_order_id
    as "Invoice"
    from
    select
    '142' as id,
    'CMRT' as source,
    'V44042' as userid,
    'EMG-7788' as externalid ,
    361 as case_party_id
    from
    dual
    a
    "Case") ) as "XML_QUERY"
    from
    select
    200 as statuscode,
    'SUCCESS' as statusmessage,
    '0000000000' as id,
    'Update' serviceaction
    from
    dual
    b;
    ===============================================================================================
    The result is as follows :
    <Response><StatusCode>200</StatusCode><StatusMessage>SUCCESS</StatusMessage><ServiceAction>Update</ServiceAction><Case><Id>142</Id><ExternalId>EMG-7788</ExternalId><Source>CMRT</Source><UserID>V44042</UserID><Note><Id>0000000000</Id></Note><Group><Membership><CasePartyId>382</CasePartyId><Address><CaseGeoAddrId>144</CaseGeoAddrId></Address></Membership></Group_*><Invoice><Invoice><*_CaseOrdrId>202</CaseOrdrId><Id>999999993                                         </Id><Prescription><CaseOrdrItmId>105</CaseOrdrItmId><RxId>1118800008</RxId><Prescriber><CasePartyIdDEA>169629</CasePartyIdDEA><CasePartyIdNPI>169630</CasePartyIdNPI><CasePartyIdSLic>169631</CasePartyIdSLic></Prescriber><PatInfo><CasePartyId>382               </CasePartyId></PatInfo></Prescription></Invoice><Invoice><CaseOrdrId>203</CaseOrdrId><Id>825478795                                         </Id><Prescription><CaseOrdrItmId>106</CaseOrdrItmId><RxId>1118800005</RxId><Prescriber><CasePartyIdDEA>169629</CasePartyIdDEA><CasePartyIdNPI>169630</CasePartyIdNPI><CasePartyIdSLic>169631</CasePartyIdSLic></Prescriber><PatInfo><CasePartyId>382               </CasePartyId></PatInfo></Prescription></Invoice><Invoice><CaseOrdrId>204</CaseOrdrId><Id>999999992                                         </Id><Prescription><CaseOrdrItmId>107</CaseOrdrItmId><RxId>1118800007</RxId><Prescriber><CasePartyIdDEA>169629</CasePartyIdDEA><CasePartyIdNPI>169630</CasePartyIdNPI><CasePartyIdSLic>169631</CasePartyIdSLic></Prescriber><PatInfo><CasePartyId>382               </CasePartyId></PatInfo></Prescription></Invoice><Invoice><CaseOrdrId>205</CaseOrdrId><Id>999999991                                         </Id><Prescription><CaseOrdrItmId>108</CaseOrdrItmId><RxId>1118800006</RxId><Prescriber><CasePartyIdDEA>169629</CasePartyIdDEA><CasePartyIdNPI>169630</CasePartyIdNPI><CasePartyIdSLic>169631</CasePartyIdSLic></Prescriber><PatInfo><CasePartyId>382               </CasePartyId></PatInfo></Prescription></Invoice></Invoice></Case></Response>
    The ISSUE : <Invoice> tag repeating twice in 3 rd line . How to correct this ?

  • XMLELEMENT/ XMLAGG functions - Fetching the result into a variable

    Hi, I have a query to generate an XML output. I have the following questions:
    1) I am typecasting the result from this query to a VARCHAR2 and I want to assign the output to a VARCHAR2 variable. Can you please help me with that. When I try to get this into a varchar variable, i get the following error:
    declare
    x varchar2(6000);
    begin
    SELECT CAST(xmlelement("itemMaster",
    xmlelement("itemNumber",lpad(d.dept_i,3,0)||lpad(d.class_i,2,0)||lpad(d.item_i,4,0)),
    xmlelement("itemDesc",NVL(d.ITEM_DESC_T,lpad(d.dept_i,3,0)||lpad(d.class_i,2,0)||lpad(d.item_i,4,0))),
    xmlelement("paltSize",p1_test),
    xmlelement("stdUOM",p1_test),
    xmlelement("sellByDayQty",d.sell_by_day_q),
    xmlelement("shflfUOM",p1_test),
    xmlelement("minShflfDayQty",d.min_shflf_day_q),
    xmlelement("itemCatgCode",NVL(d.dc_item_catg_c,'GM')),
    xmlelement("strgTempZoneCode",NVL(d.strg_tmpr_zone_c,'01')),
    xmlelement("retailAmt",retl_a),
    xmlelement("expireDateFlag",NVL(d.expire_date_f,'N')),
    xmlelement("randomWtFlag",NVL(d.rndm_wt_f,'N')),
    xmlelement("wetFlag",NVL(d.wet_f,'N')),
    xmlelement("areaCode",d.area_c),
    xmlelement("vcpQty",d.vcp_q),
    xmlelement("sspQty",d.ssp_q),
    xmlelement("hndlTypeCode",d.hndl_type_c),
    xmlelement("mstrPackTypeCode",d.mstr_pk_type_c),
    xmlelement("mstrItemTypeCode",NVL(d.mstr_item_type_c,'00')),
    xmlelement("sszCode",d.reg_ssz_excpt_c),
    xmlelement("agriFlag",NVL(d.agrl_f,'N')),
    xmlelement("itemRankCode",d.item_rank_c),
    xmlelement("hazardFlag",NVL(d.hazd_mtrl_f,'N')),
    xmlelement("createDate",to_char(d.create_d,'MM-DD-YYYY HH24:MI:SS')),
    xmlelement("updateDate",to_char(d.modf_ts,'MM-DD-YYYY HH24:MI:SS')),
    xmlelement("actvnDate",to_char(d.actvn_d,'MM-DD-YYYY HH24:MI:SS')),
    xmlelement("organicCode",d.ognc_c),
    xmlelement("lotCntlFlag",NVL(d.lot_cntl_f,'N')),
    xmlelement("flammableFlag",NVL(d.flam_c,'N')),
    xmlelement("recordMode",c.action_c),
    xmlelement("areaType",p1_test),
    xmlelement("uoms",
    xmlelement("uom",
    xmlelement("prodUOM",p1_test),
    xmlelement("ratioDen",p1_test),
    xmlelement("consldtRule",p1_test),
    xmlelement("unitWtQty",NVL(d.unit_wt_q,1)),
    xmlelement("vcpHeightQty",NVL(d.vcp_ht_q,1)),
    xmlelement("vcpWidthQty",NVL(d.vcp_wth_q,1)),
    xmlelement("vcpLengthQty",NVL(d.vcp_lgth_q,1)),
    xmlelement("layerQty",p1_test)
    (SELECT xmlelement("aliases",
    xmlagg(xmlelement("upcCode",trunc(b.bar_code_i))
    ORDER BY b.dept_i,b.class_i,b.item_i
    FROM dc_item_bar_code b,
    dc_item a
    WHERE a.dept_i = b.dept_i
    AND a.class_i = b.class_i
    AND a.item_i = b.item_i
    AND a.dept_i = c.dept_i
    AND a.class_i = c.class_i
    AND a.item_i = c.item_i
    AS VARCHAR2(4000)
    ) INTO x
    FROM dc_item d, item_wm_trigger_w c
    WHERE d.dept_i = c.dept_i
    AND d.class_i = c.class_i
    AND d.item_i = c.item_i;
    end;
    ERROR at line 1:
    ORA-06550: line 49, column 33:
    PLS-00306: wrong number or types of arguments in call to 'XMLAGG'
    ORA-06550: line 49, column 33:
    PL/SQL: ORA-00904: "XMLAGG": invalid identifier
    ORA-06550: line 4, column 1:
    PL/SQL: SQL Statement ignored
    When I run this query without the
    declare
    begin
    select....
    into...
    end
    construct, it's working perfectly fine.
    Any help would be greatly appreciated.
    Thanks,
    Nitin

    I think I confused you. The 'pre' tags are for this Oracle Forum ( not your code). If your code was formatted we can look at it better .
    For example, I have put your code in those tags(you won't see them), they are for the forum software to process.
    See, how I didn't lose the formatting?
    DECLARE
      x VARCHAR2(6000);
    BEGIN
      SELECT CAST(xmlelement("itemMaster",
                             xmlelement("itemNumber",
                                        lpad(d.dept_i, 3, 0) || lpad(d.class_i, 2, 0) ||
                                        lpad(d.item_i, 4, 0)),
                             xmlelement("itemDesc",
                                        NVL(d.ITEM_DESC_T,
                                            lpad(d.dept_i, 3, 0) ||
                                            lpad(d.class_i, 2, 0) ||
                                            lpad(d.item_i, 4, 0))),
                             xmlelement("paltSize", p1_test),
                             xmlelement("stdUOM", p1_test),
                             xmlelement("sellByDayQty", d.sell_by_day_q),
                             xmlelement("shflfUOM", p1_test),
                             xmlelement("minShflfDayQty", d.min_shflf_day_q),
                             xmlelement("itemCatgCode", NVL(d.dc_item_catg_c, 'GM')),
                             xmlelement("strgTempZoneCode",
                                        NVL(d.strg_tmpr_zone_c, '01')),
                             xmlelement("retailAmt", retl_a),
                             xmlelement("expireDateFlag", NVL(d.expire_date_f, 'N')),
                             xmlelement("randomWtFlag", NVL(d.rndm_wt_f, 'N')),
                             xmlelement("wetFlag", NVL(d.wet_f, 'N')),
                             xmlelement("areaCode", d.area_c),
                             xmlelement("vcpQty", d.vcp_q),
                             xmlelement("sspQty", d.ssp_q),
                             xmlelement("hndlTypeCode", d.hndl_type_c),
                             xmlelement("mstrPackTypeCode", d.mstr_pk_type_c),
                             xmlelement("mstrItemTypeCode",
                                        NVL(d.mstr_item_type_c, '00')),
                             xmlelement("sszCode", d.reg_ssz_excpt_c),
                             xmlelement("agriFlag", NVL(d.agrl_f, 'N')),
                             xmlelement("itemRankCode", d.item_rank_c),
                             xmlelement("hazardFlag", NVL(d.hazd_mtrl_f, 'N')),
                             xmlelement("createDate",
                                        to_char(d.create_d, 'MM-DD-YYYY HH24:MI:SS')),
                             xmlelement("updateDate",
                                        to_char(d.modf_ts, 'MM-DD-YYYY HH24:MI:SS')),
                             xmlelement("actvnDate",
                                        to_char(d.actvn_d, 'MM-DD-YYYY HH24:MI:SS')),
                             xmlelement("organicCode", d.ognc_c),
                             xmlelement("lotCntlFlag", NVL(d.lot_cntl_f, 'N')),
                             xmlelement("flammableFlag", NVL(d.flam_c, 'N')),
                             xmlelement("recordMode", c.action_c),
                             xmlelement("areaType", p1_test),
                             xmlelement("uoms",
                                        xmlelement("uom",
                                                   xmlelement("prodUOM", p1_test),
                                                   xmlelement("ratioDen", p1_test),
                                                   xmlelement("consldtRule", p1_test),
                                                   xmlelement("unitWtQty",
                                                              NVL(d.unit_wt_q, 1)),
                                                   xmlelement("vcpHeightQty",
                                                              NVL(d.vcp_ht_q, 1)),
                                                   xmlelement("vcpWidthQty",
                                                              NVL(d.vcp_wth_q, 1)),
                                                   xmlelement("vcpLengthQty",
                                                              NVL(d.vcp_lgth_q, 1)),
                                                   xmlelement("layerQty", p1_test))),
                             (SELECT xmlelement("aliases",
                                                xmlagg(xmlelement("upcCode",
                                                                  trunc(b.bar_code_i))
                                                       ORDER BY b.dept_i,
                                                       b.class_i,
                                                       b.item_i))
                                FROM dc_item_bar_code b, dc_item a
                               WHERE a.dept_i = b.dept_i
                                 AND a.class_i = b.class_i
                                 AND a.item_i = b.item_i
                                 AND a.dept_i = c.dept_i
                                 AND a.class_i = c.class_i
                                 AND a.item_i = c.item_i)) AS VARCHAR2(4000))
        INTO x
        FROM dc_item d, item_wm_trigger_w c
       WHERE d.dept_i = c.dept_i
         AND d.class_i = c.class_i
         AND d.item_i = c.item_i;
    END;
    /

  • Select using XMLAGG function cutting off the string

    Hello,
    I have string "Oracle & Oracle", when run thru the following statement I am getting &amp as not full string,
    how to avoid this and to get the right values
    SQL> select col1 from t;
    COL1
    SQL & SQL
    Test & Test
    Oracle & Oracle
    SQL> select
      2  RTRIM (XMLAGG (XMLELEMENT (E,XMLATTRIBUTES (col1|| ',' AS "Seg"))ORDER BY col1 ASC).EXTRACT ('./E[not(@Seg = preceding-sibling::E/@Seg)]/@Seg'),',') col1
      3  from t;
    COL1
    Oracle &amp; Oracle,SQL &amp; SQL,Test &amp; TestThe expected output is
    COL1
    Oracle & Oracle,SQL & SQL,Test & TestAny help would be greatly appreciated
    Thanks,

    Hi,
    & has a special meaning in XML.
    One way to avoid the problem is to avoid using '&' in your XML opeations. If you can identify some string that never occurs in col1 (I used '~?~' below) then you can change all the '&'s in col1 to that string before doing the XML operations, and change all the '~?~'s back to '&'s afterwards, like this:
    select  REPLACE ( RTRIM ( XMLAGG ( XMLELEMENT ( E
                                                     , XMLATTRIBUTES (  REPLACE ( col1
                                                  , '~?~'
                                                       || ',' AS "Seg"
                                       ) ORDER BY col1 ASC
                                 ).EXTRACT ('./E[not(@Seg = preceding-sibling::E/@Seg)]/@Seg')
              , '~?~'
              )    AS new_col1
    from    t;

  • Using the  XMLAGG function.Please help.

    I am using the flwg SQL and on execution,I get displayed the error:
    [1]: (Error): ORA-06553: PLS-306: wrong number or types of arguments in call to 'SYS_IXMLAGG'My SQL Code is as follows:
    SELECT XMLELEMENT("tables:terms",XMLATTRIBUTES('http://www.tfs.com/common/tables' as "xmlns:tables"),
          XMLAGG(x.extractedcode))
          FROM (SELECT distinct xml.extract(a.xml, '/tables:term/tables:code/text()',
                xml.getns('NS_TABLES')) as extractedcode,
                xml.extract(a.xml, '/tables:term/tables:description/text()', xml.getns('NS_TABLES')) as extracteddescription
                FROM terms a
                WHERE a.ACTIVE='Y')x  Please can some one tell me what are the ERROR is?

    Difficult to tell exactly just from the query. Have you tried changing...
    XMLAGG(x.extractedcode)
    to
    XMLAGG(XMLELEMENT("tagname", x.extractedcode))
    P.S. You may be better asking XML type questions on the XMLDB forum for which the FAQ thread is here: XML DB FAQ
    Message was edited by:
    blushadow

  • XMLELEMENT/ XMLAGG functions

    Hi, I have a query to generate an XML output. I have the following questions:
    1) I am typecasting the result from this query to a VARCHAR2 and I want to assign the output to a VARCHAR2 variable. Can you please help me with that. When I try to get this into a varchar variable, i get the following error:
    declare
    x varchar2(6000);
    begin
    SELECT CAST(xmlelement("itemMaster",
    xmlelement("itemNumber",lpad(d.dept_i,3,0)||lpad(d.class_i,2,0)||lpad(d.item_i,4,0)),
    xmlelement("itemDesc",NVL(d.ITEM_DESC_T,lpad(d.dept_i,3,0)||lpad(d.class_i,2,0)||lpad(d.item_i,4,0))),
    xmlelement("paltSize",p1_test),
    xmlelement("stdUOM",p1_test),
    xmlelement("sellByDayQty",d.sell_by_day_q),
    xmlelement("shflfUOM",p1_test),
    xmlelement("minShflfDayQty",d.min_shflf_day_q),
    xmlelement("itemCatgCode",NVL(d.dc_item_catg_c,'GM')),
    xmlelement("strgTempZoneCode",NVL(d.strg_tmpr_zone_c,'01')),
    xmlelement("retailAmt",retl_a),
    xmlelement("expireDateFlag",NVL(d.expire_date_f,'N')),
    xmlelement("randomWtFlag",NVL(d.rndm_wt_f,'N')),
    xmlelement("wetFlag",NVL(d.wet_f,'N')),
    xmlelement("areaCode",d.area_c),
    xmlelement("vcpQty",d.vcp_q),
    xmlelement("sspQty",d.ssp_q),
    xmlelement("hndlTypeCode",d.hndl_type_c),
    xmlelement("mstrPackTypeCode",d.mstr_pk_type_c),
    xmlelement("mstrItemTypeCode",NVL(d.mstr_item_type_c,'00')),
    xmlelement("sszCode",d.reg_ssz_excpt_c),
    xmlelement("agriFlag",NVL(d.agrl_f,'N')),
    xmlelement("itemRankCode",d.item_rank_c),
    xmlelement("hazardFlag",NVL(d.hazd_mtrl_f,'N')),
    xmlelement("createDate",to_char(d.create_d,'MM-DD-YYYY HH24:MI:SS')),
    xmlelement("updateDate",to_char(d.modf_ts,'MM-DD-YYYY HH24:MI:SS')),
    xmlelement("actvnDate",to_char(d.actvn_d,'MM-DD-YYYY HH24:MI:SS')),
    xmlelement("organicCode",d.ognc_c),
    xmlelement("lotCntlFlag",NVL(d.lot_cntl_f,'N')),
    xmlelement("flammableFlag",NVL(d.flam_c,'N')),
    xmlelement("recordMode",c.action_c),
    xmlelement("areaType",p1_test),
    xmlelement("uoms",
    xmlelement("uom",
    xmlelement("prodUOM",p1_test),
    xmlelement("ratioDen",p1_test),
    xmlelement("consldtRule",p1_test),
    xmlelement("unitWtQty",NVL(d.unit_wt_q,1)),
    xmlelement("vcpHeightQty",NVL(d.vcp_ht_q,1)),
    xmlelement("vcpWidthQty",NVL(d.vcp_wth_q,1)),
    xmlelement("vcpLengthQty",NVL(d.vcp_lgth_q,1)),
    xmlelement("layerQty",p1_test)
    (SELECT xmlelement("aliases",
    xmlagg(xmlelement("upcCode",trunc(b.bar_code_i))
    ORDER BY b.dept_i,b.class_i,b.item_i
    FROM dc_item_bar_code b,
    dc_item a
    WHERE a.dept_i = b.dept_i
    AND a.class_i = b.class_i
    AND a.item_i = b.item_i
    AND a.dept_i = c.dept_i
    AND a.class_i = c.class_i
    AND a.item_i = c.item_i
    AS VARCHAR2(4000)
    ) INTO x
    FROM dc_item d, item_wm_trigger_w c
    WHERE d.dept_i = c.dept_i
    AND d.class_i = c.class_i
    AND d.item_i = c.item_i;
    end;
    ERROR at line 1:
    ORA-06550: line 49, column 33:
    PLS-00306: wrong number or types of arguments in call to 'XMLAGG'
    ORA-06550: line 49, column 33:
    PL/SQL: ORA-00904: "XMLAGG": invalid identifier
    ORA-06550: line 4, column 1:
    PL/SQL: SQL Statement ignored
    When I run this query without the
    declare
    begin
    select....
    into...
    end
    construct, it's working perfectly fine.
    Any help would be greatly appreciated.
    Thanks,
    Nitin

    Is there a valid reason for putting the XMLTYPE result into a VARCHAR variable?
    In most cases you can deal with your XML document by keeping it in the XMLTYPE. Should you need it in a "character" type format, then you are better using the .getClobVal() method on the XMLTYPE result to put the results into a CLOB as this will not have the size restriction of a VARCHAR.

  • What does 'xmlagg' function do?

    I have a piece of code
    select
    RTRIM(xmlagg(xmlelement(en, empno,'.')) ||',')).EXTRACT('//text()').EXTRACT('//text()') ,',');
    from employeesCan somebody please help me understand what xmlagg, xmlelement and extract does?
    Thanks. :)
    Edited by: Termite_paste on Aug 14, 2012 5:10 AM

    xmlelement: (as simply) add xml tags to your data,
    xmlagg: aggregates xml tags.
    extract: extract nodes under a another xml node.
    drop table t1;
    create table t1 (first_name varchar2(80));
    insert into t1 values ('JANE');
    insert into t1 values ('MUSTAFA');
    insert into t1 values ('JOHN');
    commit;
    select xmlelement("name", first_name) from t1;
    select xmlagg(xmlelement("name", first_name)) from t1;
    select xmlelement("names", xmlagg(xmlelement("name", first_name))).extract('/names/name') from t1;

  • Help xmlagg function

    i have this query:
    select XMLELEMENT(name "eeml",
    XMLAGG(XMLELEMENT(name "environment",XMLCONCAT(
    XMLELEMENT(name "title", a.codice),
    XMLELEMENT(name "data", XMLATTRIBUTES(x.data_id as "id"),
    XMLCONCAT(XMLELEMENT(name "tag", x.tag),
    XMLELEMENT(name "datapoints",
    (XMLELEMENT(name "value",round(avg(x.avg_data),2)))
    XMLELEMENT(name "unit", x.unit)
                        as xml
    from ambiente a, table(a.dati) d, XMLTABLE('for $d in //data return <dati>
    <id>{data($d/@id)}</id>
    <tag>{$d/tag}</tag>
    <unit>{$d/unit}</unit>
    <avg>{(data($d/max_value)+data($d/min_value)) div 2}</avg>
    </dati>' PASSING value(d).DatiXML
    COLUMNS data_id integer PATH '/dati/id',
    tag varchar2(20) PATH '/dati/tag',
    unit varchar2(20) PATH '/dati/unit',
    avg_data number(5) PATH '/dati/avg'
    ) x
    where to_char(value(d).giorno,'YYYY')='2011'
    group by a.codice,x.data_id,x.tag,x.unit, to_char(value(d).giorno,'MON')
    order by x.data_id
    that produce:
    <eeml>
         <environment>
              <title>1</title>
              <data id="2">
                   <tag>temperature</tag>
                   <datapoints>
                        <value>36</value> //avg january value
                   </datapoints>
                   <unit>Celsius</unit>
              </data>
         </environment>
         <environment>
              <title>1</title>
              <data id="0">
                   <tag>energy</tag>
                   <datapoints>
                        <value>38.5</value> //avg january value
                   </datapoints>
                   <unit>Kilowatt</unit>
              </data>
         </environment>
         <environment>
              <title>1</title>
              <data id="2">
                   <tag>temperature</tag>
                   <datapoints>
                        <value>36</value> //avg february value
                   </datapoints>
                   <unit>Celsius</unit>
              </data>
         </environment>
         <environment>
              <title>1</title>
              <data id="0">
                   <tag>energy</tag>
                   <datapoints>
                        <value>36</value> //avg february value
                   </datapoints>
                   <unit>Kilowatthour</unit>
              </data>
         </environment>
    </eeml>
    but i want to have
    <eeml>
         <environment>
              <title>1</title>
              <data id="2">
                   <tag>temperature</tag>
                   <datapoints>
                        <value>36</value> //avg january
                        <value>36</value> //avg february
                   </datapoints>
                   <unit>Celsius</unit>
              </data>
              <data id="0">
                   <tag>energy</tag>
                   <datapoints>
                        <value>38.5</value> //avg january
                        <value>36</value> //avg february
                   </datapoints>
                   <unit>Kilowatt</unit>
              </data>
         </environment>
    </eeml>
    i have tried to put a xmlagg before the xmlconcat but doesn't work. What is the solution? Thanks for helping

    Difficult to tell exactly just from the query. Have you tried changing...
    XMLAGG(x.extractedcode)
    to
    XMLAGG(XMLELEMENT("tagname", x.extractedcode))
    P.S. You may be better asking XML type questions on the XMLDB forum for which the FAQ thread is here: XML DB FAQ
    Message was edited by:
    blushadow

  • Nested group function without group xmlagg

    I am getting nested group function without group by xmlagg when using the xmlagg function inside another xmlagg function. Find the table structure and sample data here,
    CREATE TABLE "TEST_TABLE"
       ("KEY" NUMBER(20,0),
        "NAME" VARCHAR2(50 ),
        "DESCRIPTION" VARCHAR2(100 )
       Insert into TEST_TABLE (KEY,NAME,DESCRIPTION) values (1,'sam','desc1');
       Insert into TEST_TABLE (KEY,NAME,DESCRIPTION) values (2,'max','desc2');
       Insert into TEST_TABLE (KEY,NAME,DESCRIPTION) values (3,'peter',null);
       Insert into TEST_TABLE (KEY,NAME,DESCRIPTION) values (4,'andrew',null);
    select
            XMLSerialize(document
            xmlelement("root",
             xmlagg(
               xmlelement("emp"          
               , xmlforest(Key as "ID")          
               , xmlforest(name as "ename")
               , xmlelement("Descriptions", 
               xmlagg(
                  xmlforest(description as "Desc")
           ) as clob indent
           ) as t   
          from test_table;Then i removed the xmlagg function from the above select query and used xmlelement instead
      select
            XMLSerialize(document
            xmlelement("root",
             xmlagg(
               xmlelement("emp"          
               , xmlforest(Key as "ID")          
               , xmlforest(name as "ename")
               , xmlelement("Descriptions",            
                  xmlforest(description as "Desc")
           ) as clob indent
           ) as t   
          from test_table;This is working fine, but xml created with empty elements for Descriptions element for key 3 and 4 which has null values. I need don't need Descriptions element in the xml when it has null value. Please help me to resolve this.

    You can do it with a correlated subquery :
    SQL> select xmlserialize(document
      2           xmlelement("root",
      3             xmlagg(
      4               xmlelement("emp"
      5               , xmlforest(
      6                   t.key as "ID"
      7                 , t.name as "ename"
      8                 , (
      9                     select xmlagg(
    10                              xmlelement("Desc", d.description)
    11                              order by d.description -- if necessary
    12                            )
    13                     from test_desc d
    14                     where d.key = t.key
    15                   ) as "Descriptions"
    16                 )
    17               )
    18             )
    19           ) as clob indent
    20         )
    21  from test_table t;
    XMLSERIALIZE(DOCUMENTXMLELEMEN
    <root>
      <emp>
        <ID>1</ID>
        <ename>sam</ename>
        <Descriptions>
          <Desc>desc1_1</Desc>
          <Desc>desc1_2</Desc>
          <Desc>desc1_3</Desc>
        </Descriptions>
      </emp>
      <emp>
        <ID>2</ID>
        <ename>max</ename>
        <Descriptions>
          <Desc>desc2_1</Desc>
          <Desc>desc2_2</Desc>
          <Desc>desc2_3</Desc>
        </Descriptions>
      </emp>
      <emp>
        <ID>3</ID>
        <ename>peter</ename>
      </emp>
      <emp>
        <ID>4</ID>
        <ename>andrew</ename>
      </emp>
    </root>
    Or an OUTER JOIN + GROUP-BY :
    select xmlserialize(document
             xmlelement("root",
               xmlagg(
                 xmlelement("emp"          
                 , xmlforest(
                     t.key as "ID"
                   , t.name as "ename"
                   , xmlagg(
                       xmlforest(d.description as "Desc")
                       order by d.description -- if necessary
                     ) as "Descriptions"
             ) as clob indent
    from test_table t
         left outer join test_desc d on d.key = t.key
    group by t.key
           , t.name
    ;Edited by: odie_63 on 11 juil. 2012 14:54 - added 2nd option

  • Sort order for group by functions

    I have table TAB1(notenum number, linenum number, linetext varchar2(100)).
    Each note can have multiple lines of text. Eg data
    NOTENUM     LINENUM     LINETEXT
    1     1     THIS IS LINE1.
    1     2     THIS IS LINE2.
    2     1     THIS IS LINE1 OF NOTE2.
    2     2     THIS IS LINE2 OF NOTE2.
    I need the text of lines of the most recent note (max notenum)
    <Note>THIS IS LINE1 OF NOTE2. THIS IS LINE2 OF NOTE2</Note>.
    I have a query like this
    SELECT XMLAGG(XMLPARSE(CONTENT LINETEXT WELLFORMED))
    FROM TAB1
    GROUP BY NOTENUM
    ORDER BY NOTENUM DESC
    Above query would return the text of all lines concatenated for each note and the first row would be the one with highest notenum value.
    My problem is that concatenation of the LINETEXT should happen in ascending order of LINENUM. Since LINENUM is not in GROUP BY clause I cannot specify it in ORDER BY.
    How can I specify to XMLAGG (for that matter any group by function) to concatenate text in a specific order.
    I hope I was able to explain my problem clear enough for somebody to help.
    thanks for all the help
    Message was edited by:
    user448703
    Message was edited by:
    user448703

    Never mind. I just found out that XMLAGG function has the option to specify ORDER BY. I think that will work.

  • ORDER BY Clause in XMLAGG is throwing errors.

    Hi,
    I'm getting errors when generating the XML using the ORDER BY clause in the XMLAgg function. Although, running the SQL directly in SQL Plus doesn't have any problem.
    Here is the PL/SQL sample.
    DECLARE
    vX_XML SYS.XMLTYPE;
    vCL_XML CLOB;
    BEGIN
    SELECT XMLElement("GROUP",
    XMLAttributes(Group_Id AS "ID", Group_Name AS "NAME", Group_Description AS "DESC"),
    XMLAgg(XMLElement("FIELD",
    XMLAttributes(Field_Id AS "ID", Field_Description AS "DESC",
    Table_Name AS "TAB_NM", Rule_Name AS "RULE_NM",
    Field_Hierarchy_Depth AS "DOL_VAR_CALC")) ORDER BY Field_Description))
    INTO vX_XML
    FROM (SELECT g.Group_Id, g.Group_Name, g.Group_Description, f.Field_Id, f.Field_Description,
    DECODE(f.Table_Name, 'ESTIMATES', 'E', 'LINE_ITEMS', 'L', NULL) Table_Name,
    rt.Rule_Name,
    CASE NVL(f.Field_Hierarchy_Depth, 0) WHEN 0 THEN 'N' ELSE 'Y' END Field_Hierarchy_Depth
    FROM GROUPS g,
    Rules r,
    Rule_Types rt,
    Fields f
    WHERE g.Group_Id = 3087
    AND r.Group_Id_Fk = g.Group_Id
    AND rt.Rule_Type_Id = r.Rule_Type_Id_Fk
    AND f.Field_Id = r.Field_Id_Fk) tab
    GROUP BY Group_Id, Group_Name, Group_Description;
    vCL_XML := vX_XML.GetCLOBVal();
    END;
    And, here are the errors.
    ERROR at line 8:
    ORA-06550: line 8, column 23:
    PLS-00306: wrong number or types of arguments in call to 'XMLAGG'
    ORA-06550: line 8, column 23:
    PL/SQL: ORA-00904: "XMLAGG": invalid identifier
    ORA-06550: line 6, column 5:
    PL/SQL: SQL Statement ignored
    Thanks in Advance.
    BTW, we are using Oracle 9.2.0.4.

    This is bug 2785463 with no ETA for a fix
    regards
    Coby D. Adams Jr.

  • XmlAgg Order By in SQL Statement vs Stored Procedure - 9.2.0.3.0

    Hi All,
    I'm having a problem with the XMLAgg function's ORDER BY clause after upgrading to 9.2.0.3.0.
    I'm finding that I can succesfully execute a SQL statement with the XMLAgg ORDER BY clause, but cannot compile a stored procedure using ORDER BY. Below are two examples executing against the SCOTT Schema. They use the same code, except one is contained in a procedure.
    I'm running 9.2.0.3.0 on Windows XP Pro, SP1
    Plain SQL Statement (executes correctly):
    SELECT
    XMLElement("test",
    XMLAgg(
    XMLElement("element",
    XMLAttributes(Scott.Emp.Ename as "ename", Scott.Emp.Empno as "enum")
    ) --xmlElement element
    ORDER BY Scott.Emp.Ename desc
    ) --XmlAgg
    ).getClobVal() --xmlElement test
    as TestXML
    from Scott.Emp;
    Stored Procedure:
    create or replace procedure zorder(TestXML OUT clob) is
    begin
    SELECT
    XMLElement("test",
    XMLAgg(
    XMLElement("element",
    XMLAttributes(Scott.Emp.Ename as "ename", Scott.Emp.Empno as "enum")
    ) --xmlElement element
    ORDER BY Scott.Emp.Ename desc
    ) --XmlAgg
    ).getClobVal() --xmlElement test
    into TestXML
    from Scott.Emp;
    end zorder;
    I get the following errors when attempting to compile the stored procedure:
    7 PLS-00306: wrong number of types or arguments in call to 'XMLAGG'
    7 PL/SQL: ORA-00904: "XMLAGG": invalid identifier
    5 PL/SQL: SQL Statement ignored
    Does anybody know why this code executes correctly in a SQL statement, but fails in a procedure? Is the Order By clause not available in a procedure? I need to get this functionality working in the procedure.
    Thanks,
    Brian

    A good simple workaround (that doesn't require runtime parsing) is to simply sub-query:
    SELECT
    XMLElement("test",
        XMLAgg(
            XMLElement(
                "element",
                XMLAttributes(Scott.Emp.Ename as "ename", Scott.Emp.Empno as "enum")
            ) --xmlElement element
        ) --XmlAgg
    ).getClobVal() --xmlElement test
    into TestXML
    from (
        SELECT Ename,Empno
        FROM Scott.Emp
        ORDER BY Scott.Emp.Ename desc

  • ORA-00907: missing right parenthesis when using group by clause with xmlagg

    I have the following query and I am getting ORA 00907 Error when I am using group by clause with the xmlagg function.
    select xmlelement("Mitigation",
                    xmlelement("m_szMethodName",tm.DisplayName),
                    xmlelement("SubstanceInterferenceProtocolList",
                                (select xmlagg(xmlelement("MitigationProtocol",
                                        xmlelement("m_szMethodName",tm.DisplayName),
                                        xmlelement("m_szInterferenceProtocolName",tmp.protocol_name),
                                        xmlelement("m_szInterferenceSubstance",tmp.intf_mtrl_prod_code),
                                        xmlelement("m_ProtocolParameters",
                                            xmlelement("m_szProtocolName",tmp.protocol_name),
                                                xmlelement("m_Consumables",
                                                    xmlelement("Consumable",
                                                        xmlelement("m_szConsumId", xrl.rgnt_pack_name),
                                                        xmlelement("m_szProductCode",xrl.pack_prod_code),
                                                        xmlelement("m_nVolume",tmp.fluid_vol),
                                                        xmlelement("m_szProtocolStep",xps.protocol_step_name))),
                                                    xmlelement("m_ProtParamList",
                                                        xmlagg(
                                                        xmlelement("ParameterValues",
                                                            xmlelement("m_szProtocolName",tmp.protocol_name),
                                                            xmlelement("m_Time",xpsd.parameter_ntime_value))
                                                        group by tmp.ccd_test_id,tmp.intf_mtrl_prod_code)
                    order by tmp.ccd_test_id, tmp.intf_mtrl_prod_code, xps.protocol_step_intprotocolstep )
                    from XPR_tdef_mitigation_protocol tmp, xp_reagentlist xrl,
                    xpr_protocol_settings xps, xpr_protocol_settings_default xpsd
                    where tmp.ccd_test_id = tm.ccd_test_id
                    and tmp.ccd_test_id = xrl.ccd_test_id
                    and tmp.pack_prod_code = xrl.pack_prod_code
                    and tmp.intf_type = 1
                    and xps.protocol_name = xpsd.protocol_name
                    and xps.protocol_step_name = xpsd.protocol_step_name
                    and xps.ps_action_parameterlist = xpsd.ps_action_parameterlist
                    and xps.protocol_name =  tmp.PROTOCOL_NAME
    from XPtoXPRTdef_defn_mapping tm
    where tm.DisplayName = 'SYPH'If I remove the xmlagg clause along with the group by clause, the query runs fine and give me the output.
    But in that XML format of the output is incorrect for my application.
    Could someone help here?

    Hi,
    userAtoZ wrote:
    I have the following query and I am getting ORA 00907 Error when I am using group by clause with the xmlagg function.
    ... xmlagg(
    xmlelement("ParameterValues",
    xmlelement("m_szProtocolName",tmp.protocol_name),
    xmlelement("m_Time",xpsd.parameter_ntime_value))
    group by tmp.ccd_test_id,tmp.intf_mtrl_prod_code)Please don't post unformatted code. When posting any formatted text on this site, type these 6 characters:
    \(small letters only, inside curly brackets) before and after each section of formatted text, to preserve spacing.
    If the code above were formatted well, so that you could match each '(' with its closing ')', it would look something like this:... xmlagg ( xmlelement ( "ParameterValues"
                        , xmlelement ( "m_szProtocolName"
                                       , tmp.protocol_name
                        , xmlelement ( "m_Time"
                                       , xpsd.parameter_ntime_value
    group by tmp.ccd_test_id
                        ,     tmp.intf_mtrl_prod_code
    This is exactly what you posted, only the whitespace has been changed.
    This makes it clear that the GROUP BY is inside the parentheses with the argument to XMLAGG.  You can have an ORDER BY clause there, but not a GROUP BY clause.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

Maybe you are looking for

  • Can't open library after upgrade to iPhoto '11

    I have seen a few people have the same/similar problem but their solutions haven't helped me. Bought new macbook pro two weeks ago. iPhoto didn't work when I had imported my old info onto my computer, but then after three wipes of the computer and a

  • Why no sender idoc adapter .

    hi,      while configuring idoc to file ......... why we are not using sender communication channel or configuring sender idoc adapter .............. thanks in advance, jp.

  • Reorganizing in Photoshop Elements Organizer 11

    I want to import photos from a file on my computer into Photoshop Organizer 11 and REORGANIZE them. Once they are in there, I want to move some photos in front of others- chronologically- from 2-3 different cameras and then BATCH RENAME them all acco

  • Getting directory names

    Hi there, I am writing an application to read the contents of a user specified directory. What I am wondering is, if I specify the cd-rom drive for example, is there any way of getting the 'title' of the cd, ie what would appear in windows explorer n

  • Colour settings across Adobe

    Hi chaps, Ive recently updated my eizo monitor colour using colormunki and colornavigator. I had left it too long before the last profile update, so i can see a difference and ultimately doubts come into play What i noticed across photoshop/indesign,