一次将多个 XML 文件加载/插入到 Oracle 表中

问题描述

我有一个表 xml_table_date。下面是表中的结构和示例数据。

但是我想一次性插入多个xml文件(这里是9个)到表中。这些文件驻留在一个 DB 目录中

我将xml文件插入表格的代码

CREATE TABLE xml_table_data (
  File_name  varchar2(100),Insert_date timestamp
  xml_data  XMLTYPE
);

INSERT INTO xml_tab VALUES ( 'DataTransfer_HH_TWWholesale_001_004_12142020113003.xml',XMLTYPE (BFILENAME ('TESTING','DataTransfer_HH_TWWholesale_001_004_12142020113003.xml'),NLS_CHARSET_ID ('AL32UTF8')));
                          

enter image description here

enter image description here

enter image description here

请帮我解决这个问题。感谢您阅读我的查询

解决方法

您可以使用带有前置处理的外部表从目录中读取文件名。

ALTER SESSION SET CONTAINER=pdb1;

CREATE DIRECTORY data_dir   AS '/u02/data';
CREATE DIRECTORY script_dir AS '/u02/scripts';
CREATE DIRECTORY log_dir    AS '/u02/logs';

GRANT READ,WRITE ON DIRECTORY   data_dir   TO demo1;
GRANT READ,EXECUTE ON DIRECTORY script_dir TO demo1;
GRANT READ,WRITE ON DIRECTORY   log_dir    TO demo1;

在脚本目录中创建一个 list_files.sh 文件。确保 oracle 是所有者并且该文件的权限为 755。 预处理脚本文件不继承 $PATH 环境变量。所以你必须在所有命令之前加上 /usr/bin。

/usr/bin/ls -1 /u02/data/test*.xml | /usr/bin/xargs -n1 /usr/bin/basename

您还需要一个外部表的源文件,但这可以是一个空的虚拟文件。

CREATE TABLE data_files
   ( file_name VARCHAR2(255))
ORGANIZATION EXTERNAL
(
   TYPE ORACLE_LOADER
   DEFAULT DIRECTORY data_dir
   ACCESS PARAMETERS
      ( RECORDS DELIMITED BY NEWLINE CHARACTERSET AL32UTF8
        PREPROCESSOR script_dir: 'list_files.sh'
        BADFILE log_dir:'list_files_%a_%p.bad'
        LOGFILE log_dir:'list_files_%a_%p.log'
        FIELDS TERMINATED BY WHITESPACE
      )
   LOCATION ('dummy.txt')
)
REJECT LIMIT UNLIMITED;

现在您可以将 xml 数据插入到您的表中。

INSERT INTO xml_table_data
   ( file_name,insert_date,xml_data
   )
SELECT file_name,SYSTIMESTAMP,XMLTYPE (BFILENAME ('DATA_DIR',file_name),NLS_CHARSET_ID ('AL32UTF8'))
  FROM data_files;

您仍然需要根据您的环境调整示例。