Oracle PLSQLを使用して、XMLType型のXMLフラグメントをいくつか生成するようになりました。これらはXMLTYPEタイプのVARRAYに保存されています。これらを個別にファイルに正常に印刷できます。
次に実行したいのは、これらすべてのフラグメントを融合し、それらを別のルート要素でラップして、単一のドキュメントを生成することです。XMLSEQUENCETYPEを取得できる場合は、これをXMLCONCAT(..)に渡すだけで、すべてのフラグメントのXMLType連結が返されるはずです。この後は、XMLELEMENT(..)を使用してルート要素を追加する場合になります。ただし、XMLTYPEのVARRAYからXMLSEQUENCETYPEを生成する方法を見つけるのに苦労しています。
誰かがこれをどのように行うことができるか、そして実際に私が取ったアプローチが最良のものであるかどうかを知っていますか?(興味があれば、基本的なdbunitタイプのフレームワークを作成しようとしています。このスクリプトの目的は、XMLデータセットをファイルに出力するために使用できるツールを作成することです。このツールは後で単体テストに読み込まれます)。
plsqlスクリプトは次のとおりです。
set serveroutput on;
CREATE OR REPLACE TYPE rowset_query_type AS OBJECT (
table_name VARCHAR2(100),
query_string VARCHAR2(1024)
);
/
DECLARE
TYPE XML_Fragments_Type IS VARRAY(1000) OF XMLTYPE;
TYPE Rowset_Query_List_Type is VARRAY(1000) OF rowset_query_type;
outputDir VARCHAR(200) := 'ORACLE_FILE_DIR';
outputFile VARCHAR(200) := 'TestDataSet.xml';
qryCtx DBMS_XMLGEN.ctxHandle;
rowsetResultFragments XML_Fragments_Type;
rowsetQueries Rowset_Query_List_Type;
xmlResult xmltype;
rowsetQueryElement rowset_query_type;
output CLOB;
BEGIN
dbms_output.put_line('Exporting dataset...');
-- export files to data fixture
-- define fixtures
rowsetQueries := Rowset_Query_List_Type();
rowsetQueries.EXTEND(2);
rowsetQueries := Rowset_Query_List_Type(
rowset_query_type('person', 'select * from person'),
rowset_query_type('address','select * from address'));
rowsetResultFragments := XML_Fragments_Type();
rowsetResultFragments.EXTEND(rowsetQueries.count);
FOR i IN rowsetQueries.FIRST..rowsetQueries.LAST
LOOP
rowsetQueryElement := rowsetQueries(i);
dbms_output.put_line('Extracting dataset for table: ' || rowsetQueryElement.table_name || ' using query: ''' || rowsetQueryElement.query_string || '''');
qryCtx := dbms_xmlgen.newContext(rowsetQueryElement.query_string);
-- wrap the result up with a metadata tag containing the fixture tablename
select xmlelement(
"ROWSET_QUERY",
xmlattributes(rowsetQueryElement.table_name as "tableName"),
DBMS_XMLGEN.getXMLType(qryCtx)
)
into rowsetResultFragments(i)
from dual;
--close context
DBMS_XMLGEN.closeContext(qryCtx);
-- print the results to console
-- serialize the result for printing to output
SELECT XMLSERIALIZE(
CONTENT
rowsetResultFragments(i)
AS CLOB)
INTO output
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(output);
END LOOP;
-- concatenate the set of rowsetQueries result fragments to a single result clob
-- ???
END;
/