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.

Similar Messages

  • 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;
    /

  • 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

  • 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 ?

  • 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

  • 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

  • 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.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

  • XMLAgg and order by

    Hello;
    I can't seem to figure out how to use the "order by" syntax of the XMLAgg() function - wondering if someone has a short example they could share.
    As specified in the syntax diagram for XMLAgg()(http://otn.oracle.com/docs/products/oracle9i/doc_library/release2/appdev.920/a96620/xdb12gen.htm#1027574), it should be possible to specify an order by clause that lets me sort the nested elements.
    Every variation I've tried though doesn't let me do it. Here's a simplified examaple.
    What I want to do have the nested <emp> elements sorted by e.name in the produced xml.
    Any/all help is appreciated.
    Regards,
    Brian.
    SELECT XMLELEMENT( "Department", XMLATTRIBUTES ( d.dname AS "name" ),
    (SELECT XMLAGG(XMLELEMENT ("emp", XMLATTRIBUTES (e.ename AS name) ))
    FROM scott.emp e
    WHERE e.deptno = d.deptno) ) AS "dept_list"
    FROM scott.dept d ;
    <Department name="Accounting">
    <emp name="Smith"/>
    <emp name="Yates"/>
    </Department>
    <Department name="Shipping">
    <emp name="Martin"/>
    <emp name="Oppenheimer"/>
    </Department>

    Hi
    Here an example with 9.2.0.2.0...
    SQL&gt; SELECT ename, sal
    2 FROM emp
    3 WHERE deptno = 10;
    ENAME SAL
    CLARK 2450
    KING 5000
    MILLER 1300
    SQL&gt; SELECT XMLAgg(XMLElement("ename", ename) ORDER BY ename) result
    2 FROM emp
    3 WHERE deptno = 10;
    RESULT
    &lt;ename&gt;CLARK&lt;/ename&gt;
    &lt;ename&gt;KING&lt;/ename&gt;
    &lt;ename&gt;MILLER&lt;/ename&gt;
    SQL&gt; SELECT XMLAgg(XMLElement("ename", ename) ORDER BY sal) result
    2 FROM emp
    3 WHERE deptno = 10;
    RESULT
    &lt;ename&gt;MILLER&lt;/ename&gt;
    &lt;ename&gt;CLARK&lt;/ename&gt;
    &lt;ename&gt;KING&lt;/ename&gt;
    Chris

Maybe you are looking for

  • CALL_FUNCTION_OPEN_ERROR in CRM while trying to connect to ECC system

    Hi All, We are having issues while connecting to ECC system from CRM at specific point of time. It occurred only once yesterday . Since it is a production system, we need to investigate the cause of the issue. Upon checking the logs, I can see dumps

  • Downpayment  and then invoice (milestone)

    Dear Frnds,                     I have a few issues working with billing plan............pls do assist I am currently using Milestone billing plan for customer transactions. The client  billing plan has booking amount, next installment and Final inst

  • Call WAPI error in web dynpro app

    I write a very simple demo workflow, there is a approve step that call a web dynpro app. I pass workitemid to my web dynpro program, then It call fm SAP_WAPI_RESERVE_WORKITEM and SAP_WAPI_WORKITEM_COMPLETE to comlete workitem programmly. In SAPGUI wo

  • Where's the Exception???

    Try creating a JSP containing nothing but this: <% String bad = null; bad.equals("death"); %> This will show a 404 error and NOT display a stack trace! What gives? When I have a real problem, how I am I supposed to debug it if handlePageException eat

  • Select List with Redirect clears Foreign Key

    I have two pages created by the Form wizard, a report and a form, with a Create button on the report page. When the Create button is pressed it passes a Foreign Key item using f?p syntax - stardard code, so far, so good, the form page works fine. How