いくつかの XML ファイルを Oracle データベース (Linux x64 上の 11gr2) にロードしましたが、複数のレコードを含む xml ファイルを正常にインポートするには、fn:string-join を使用する必要がありました。
SQL*LOADER を使用してデータが XMLTYPE テーブルに読み込まれ、インポートされた後、XML データを XMLTYPE テーブルから通常のテーブルに転送するクエリを発行しました。これを Table_A と呼びます。
このテーブルには、インポートされたレコードのすべてのフィールド (この場合は 2 つのレコード) が一緒にターゲット フィールドに含まれるようになりました。
xml ファイルには computer_brand のエントリが含まれており、最初のレコードの値は「Dell」で、2 番目のレコードの値は「Apple」です。XML ファイルからの 2 つのレコードが選択され、Table_A に挿入されましたが、同じフィールドにあり、セミコロンで区切られています。フィールド名: computer_brand 値: Dell;Apple
私がしたいのは、テーブルから個別の値を選択し (このクエリはスケジュールされたジョブから実行する必要があるため、フィールド内の異なる値の数に関係なく)、それらを通過させてすべての値を独自に挿入することです別々のフィールド。
これが私が作った/使ったものの例です:
Table_A メタデータ:
CREATE TABLE table_a
(
computer_brand varchar2(41),
owner varchar2(101),
address varchar2(101),
serialnumber varchar2(21)
)
次のクエリを使用して、xmltype テーブルからインポートされたデータを選択し、Table_A に挿入しました。
insert into table_a
(computer_brand,
owner,
address,
serialnumber
)
select
a.computer_brand,
a.owner,
a.address,
a.serialnumber
from table_xml a,
xmltable (xmlnamespaces('not mentioned due to security reasons' as "tns"),
'//tns:Main' passing a.xml_file
columns
computer_brand varchar2(41) path 'fn:string-join(tns:/@computer_brand,";")',
owner varchar2(101) path 'fn:string-join(tns:/@owner,";")',
address varchar2(101) path 'fn:string-join(tns:/@address,";")',
serialnumber varchar2(21) path 'fn:string-join(tns:/serialnumber,";")')
(+) k
where upper(file_name)=upper('xmlfile.xml');
上記のクエリの出力は次のとおりです。
computer_brand
--------------
dell;apple
owner
--------------
pete;jack
address
--------------
basement;attic
serialnumber
--------------
123444;456555
誰かが方法を知っていて助けてくれたら、事前に多大な感謝をしますか? 私が見ていましたが、実際にSUBSTR()
はそれを修正することができませんでした..