テーブル内のデータのXML表現を取得する場合は、dbms_xmlgenパッケージを確認してください。たとえば、次のような単純な関数を記述できます。
SQL> create or replace function GenXML(p_query in varchar2, p_RSetTag in varchar2)
2 return clob
3 is
4 l_xmlcntx dbms_xmlgen.ctxHandle;
5 l_resxml clob;
6 begin
7 l_xmlcntx := dbms_xmlgen.newContext(p_query);
8 dbms_xmlgen.setRowSetTag(l_xmlcntx, p_RSetTag);
9 l_resxml := dbms_xmlgen.getXML(l_xmlcntx);
10 dbms_xmlgen.closeContext(l_xmlcntx);
11 return l_resxml;
12 end;
13 /
Function created
次に、クエリをテーブルと行セットタグにパラメータとして渡すことにより、次のように使用します。
SQL> select genxml('select * from employees where rownum = 1','EMPLOYEES') as XmlData
2 from dual
3 ;
XMLDATA
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<EMPLOYEES>
<ROW>
<EMPLOYEE_ID>100</EMPLOYEE_ID>
<FIRST_NAME>100</FIRST_NAME>
<LAST_NAME>King</LAST_NAME>
<EMAIL>SKING</EMAIL>
<PHONE_NUMBER>515.123.4567</PHONE_NUMBER>
<HIRE_DATE>17-JUN-03</HIRE_DATE>
<JOB_ID>AD_PRES</JOB_ID>
<SALARY>24000</SALARY>
<DEPARTMENT_ID>90</DEPARTMENT_ID>
</ROW>
</EMPLOYEES>
SQL>
コメントへの回答
マスター/詳細タイプのデータ構造を表示するには、を使用できますcursor
。例えば:
SQL> select genxml('select department_id
2 , department_name
3 , cursor(
4 select first_name
5 from employees t
6 where t.department_id = d.department_id
7 ) employees
8 from departments d
9 where rownum = 1','DEPARTMENTS') xmldata
10 from dual
11 ;
XMLDATA
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<DEPARTMENTS>
<ROW>
<DEPARTMENT_ID>10</DEPARTMENT_ID>
<DEPARTMENT_NAME>Administration</DEPARTMENT_NAME>
<EMPLOYEES>
<EMPLOYEES_ROW>
<FIRST_NAME>Jennifer</FIRST_NAME>
</EMPLOYEES_ROW>
</EMPLOYEES>
</ROW>
</DEPARTMENTS>
更新#2コメントへの応答:
「detail」(カーソル)がnullの場合に残っている開始タグと終了タグを削除するには、クエリを次のように書き直します。次に例を示します。
SELECT XMLElement("DEPARTMENTS"
, XMLAgg( XMLElement( "ROW"
, XMLForest( t.department_id
, t.department_name
)
, (
SELECT XMLAgg(XMLElement("EMPLOYEES"
, XMLForest (q.first_name)
)
)
FROM employees q
WHERE q.department_id = t.department_id
--and 100=101
)
)
)
)
タグをより細かく制御するため。そして、上記のクエリの結果を次のようにファイルに保存します。以下のコードを実行する前に、ディレクトリを作成する必要がありますCreate directory <name> as <path>
。の代わりにディレクトリの場合は名前を入力しますXMLDIR
。
declare
l_xml clob;
begin
SELECT XMLElement("DEPARTMENTS"
, XMLAgg( XMLElement( "ROW"
, XMLForest( t.department_id
, t.department_name
)
, (
SELECT XMLAgg(XMLElement("EMPLOYEES"
, XMLForest (q.first_name)
)
)
FROM employees q
WHERE q.department_id = t.department_id
--and 100=101
)
)
)
).getclobval() into l_xml
FROM departments t
where rownum < 3;
dbms_xslprocessor.clob2file(l_xml, 'XMLDIR', 'XmlFile.xml');
end;
結果#1:サブクエリがデータを返す場合
<DEPARTMENTS>
<ROW>
<DEPARTMENT_ID>10</DEPARTMENT_ID>
<DEPARTMENT_NAME>Administration</DEPARTMENT_NAME>
<EMPLOYEES>
<FIRST_NAME>Jennifer</FIRST_NAME>
</EMPLOYEES>
</ROW>
<ROW>
<DEPARTMENT_ID>20</DEPARTMENT_ID>
<DEPARTMENT_NAME>Marketing</DEPARTMENT_NAME>
<EMPLOYEES>
<FIRST_NAME>Michael</FIRST_NAME>
</EMPLOYEES>
<EMPLOYEES>
<FIRST_NAME>Pat</FIRST_NAME>
</EMPLOYEES>
</ROW>
</DEPARTMENTS>
結果#2:サブクエリがデータを返さない場合
<DEPARTMENTS>
<ROW>
<DEPARTMENT_ID>10</DEPARTMENT_ID>
<DEPARTMENT_NAME>Administration</DEPARTMENT_NAME>
</ROW>
<ROW>
<DEPARTMENT_ID>20</DEPARTMENT_ID>
<DEPARTMENT_NAME>Marketing</DEPARTMENT_NAME>
</ROW>
</DEPARTMENTS>