问题描述
我有一个表 xml_table_date。下面是表中的结构和示例数据。
但是我想一次性插入多个xml文件(这里是9个)到表中。这些文件驻留在一个 DB 目录中
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')));
解决方法
您可以使用带有前置处理的外部表从目录中读取文件名。
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;
您仍然需要根据您的环境调整示例。