1

いくつかの 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()はそれを修正することができませんでした..

4

1 に答える 1