Lulli: XML Query mit Union

Hi,

kann mir vielleicht jemand bei einer XML query für eine Oracle DB helfen?

Brauche XML code von der folgenden query:
select * from dba_stmt_audit_opts union select * from dba_priv_audit_opts;

xml schema ist:
<xsd:complexType name="sec_tauditing">
xsd:sequence
<xsd:element name="sec_audit" type="xsd:string" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="sec_audit_option" type="xsd:string" use="required" />
<xsd:attribute name="sec_auditing_user_name" type="xsd:string" use="required" />
<xsd:attribute name="sec_auditing_proxy" type="xsd:string"/>
<xsd:attribute name="sec_auditing_success" type="xsd:string" use="required" />
<xsd:attribute name="sec_auditing_failure" type="xsd:string" use="required" />
</xsd:complexType>

Nachfolgend mein Versuch der mir aber einen Fehler bringt: ora-01427: single row subquery returns more than one row

SELECT xmlelement ("sec_auditing",
xmlagg((
select xmlelement("sec_audit",
xmlattributes (audit_option as "sec_audit_option", user_name AS "sec_auditing_user_name", proxy_name AS "sec_auditing_proxy", success AS "sec_auditing_success", failure AS "sec_auditing_failure"))
FROM dba_stmt_audit_opts
union all
select xmlelement("sec_audit",
xmlattributes (privilege as "sec_audit_option", user_name AS "sec_auditing_user_name", proxy_name AS "sec_auditing_proxy", success AS "sec_auditing_success", failure AS "sec_auditing_failure"))
from dba_priv_audit_opts))) from dual
/

Irgendjemand mit einer Idee wie ich das hinbekommen könnte?

Thanks!

  1. yo,

    mal davon abgesehen, dass ich von XML keine ahnung habe, AS optional ist und ich es in aller regel weglasssen würde, man bei einem UNION / UNION ALL nur das erste Select mit namen qualifizieren muss und nicht alle, liegt es wohl an deiner ungewöhnlichen schreibweise, dass du die doch eindeutige fehlermeldung nicht richtig zuordnen kannst.

    du hast das UNION ALL konstrukt als unterabfrager in der projektion der äußeren abfrage erstellt. und da du mehrere datensätze und wohl auch spalten mit deinem UNION ALL zurück bekommst, er dort aber nur einen wert erwartet, kommt diese fehlermeldung. was du machen willst (reine vermutung), ist sicherlich die unterabfrage mit dem UNION ALL als unterabfrage in der FROM klausel setzen und weniger als projektion.

    das hast du gemacht:

    SELECT (hier_dein_UNION_ALL)
    FROM dual
    ;

    das willst du wohl haben:

    SELECT tab.*
    FROM (hier_dein_UNION_ALL) tab
    ;

    Ilja

    1. Hallo,

      also meinst du?

      SELECT tab.\* from (select xmlelement ("sec\_auditing",  
      xmlagg((  
      		select xmlelement("sec\_audit",  
      				  xmlattributes (audit\_option as "sec\_audit\_option", user\_name AS "sec\_auditing\_user\_name", proxy\_name AS "sec\_auditing\_proxy", success AS "sec\_auditing\_success", failure AS "sec\_auditing\_failure"))  
      FROM dba\_stmt\_audit\_opts  
      union all  
      		select xmlelement("sec\_audit",  
      				  xmlattributes (privilege as "sec\_audit\_option", user\_name AS "sec\_auditing\_user\_name", proxy\_name AS "sec\_auditing\_proxy", success AS "sec\_auditing\_success", failure AS "sec\_auditing\_failure"))  
      from dba\_priv\_audit\_opts))) from dual) tab  
      

      /

      Das bringt mir den gleichen Fehler. Auch das weglassen des AS beim zweiten teil von UNION ändert leider nichts. Sonst noch eine Idee oder habe ich deinen Ansatz falsch umgesetzt?

      Danke und Gruß,

      Lulli

      1. yo,

        Das bringt mir den gleichen Fehler. Auch das weglassen des AS beim zweiten teil von UNION ändert leider nichts. Sonst noch eine Idee oder habe ich deinen Ansatz falsch umgesetzt?

        ist nicht ganz, was ich gemeint habe, aber wie auch immer, ich bekomme bei genau dieser anweisung gar keine fehlermeldung, es läuft fehlerfrei durch. wie kannst du dann genau die gleiche bekommen ?

        Ilja