请求您在以下方面提供帮助和专业知识:
UNIX 服务器上的 Oracle DB 19c
要求: CSV 文件每天都会进入 Unix 目录(数据库所在的位置)并加载到数据库表中。记录终止符是 LF (Unix)。 CSV 文件的字符串中可以包含换行符 (LF),也可以包含特殊字符。如果字段中嵌入了逗号,则它们会用双引号引起来。跳过标题行。跳过加载包含所有空字段的行。所需的输出是获取此示例 CSV 文件中加载的所有记录。现实世界中的所有这些 CSV 文件在附加到主表之前都会通过外部表读取。
CSV 文件(dummy_test_file.csv):
EMP_ID,EMP_DEPT,EMP_NAME,EMP_SAL,EMP_COMMENTS
101,Accounting,John Doe,78000,None
MM202,Finance,Jack N Doe,80000,"PTO, OOO"
303,Finance,"Dunham, Melissa",98000,N/A µóíé ``é
404,Info Tech,O'Connor A.,,
Z505,""Infra Services,Joe Miller,67000,,Infra
606,""R&D"" Info. Sec - Commercial,Jack Miller,68000,""
707,""Accounting & Offices"",M'ria Flo,55000,20-PPES
808,"- State S7 -20 - 24
- state S3 ,//- 29 - 32
- INC - 49 - 56 (14.004% inic)
- SD",Scala F. Mora,88000,Static
909,",",Nem Rogers,66500,Cambridge - MA
,,,,
1101,,,,""1""
AX2202,Finance,Meryl Jane,110000,STEM &^%$#@!~()_+-=|:"<>?{}[]\;'./`~Pro - D.
我的尝试: 我使用了 ORACLE_LOADER 外部表,并使用了 FIELDS CSV WITH EMBEDDED 选项。它非常适合加载带有特殊字符的值,并且还可以处理字段中的嵌入换行符(如果有)。但是...
问题: 它无法加载某些场景的数据,如下所述,在我运行 select 语句后生成的 BAD 文件中。
错误文件:
Z505,""Infra Services,Joe Miller,67000,,Infra
606,""R&D"" Info. Sec - Commercial,Jack Miller,68000,""
707,""Accounting & Offices"",M'ria Flo,55000,20-PPES
1101,,,,""1""
脚本:
CREATE TABLE EXT_OL_DUMMY_CSV_LOAD
(
EMP_ID VARCHAR2(10 BYTE),
EMP_DEPT VARCHAR2(200 BYTE),
EMP_NAME VARCHAR2(50 BYTE),
EMP_SAL NUMBER,
EMP_COMMENTS VARCHAR2(4000 BYTE)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY MY_FILES_DIR
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
BADFILE 'dummy_test_file.bad'
LOGFILE 'dummy_test_file.log'
SKIP 1
FIELDS CSV WITH EMBEDDED
NOTRIM
MISSING FIELD VALUES ARE NULL
REJECT ROWS WITH ALL NULL FIELDS
)
LOCATION ( MY_FILES_DIR:'dummy_test_file.csv' )
)
REJECT LIMIT UNLIMITED
PARALLEL 5
/
SELECT * FROM EXT_OL_DUMMY_CSV_LOAD;
当前输出: - 未加载所有记录
询问
有什么想法可以如何利用 Oracle Loader 的功能加载所有这些记录,而不使用预处理器?也欢迎任何其他想法,前提是它不能用 Oracle_Loader 处理。值得一提的是,我还可以访问 Oracle APEX 软件包(如果这些软件包对解决此问题有任何帮助)。预先感谢任何提供帮助的人。 :)
我不熟悉 Oracle Loader,因此这里有一个使用 apex 包来执行此操作的选项。以下是如何使用错误文件的内容解析 CLOB:
SELECT
col001, col002, col003, col004, col005
FROM TABLE(
APEX_DATA_PARSER.parse(
p_content => apex_util.clob_to_blob(
p_clob => q'!Z505,""Infra Services,Joe Miller,67000,,Infra
606,""R&D"" Info. Sec - Commercial,Jack Miller,68000,""
707,""Accounting & Offices"",M'ria Flo,55000,20-PPES
1101,,,,""1""!',
p_charset => 'AL32UTF8' )
,
p_file_name => 'emp.csv' /*to get the file type*/
,p_skip_rows => 1 /*default 0*/
,p_csv_col_delimiter => ','
)
);
select * from dual
有几个关于它的博客应该很容易找到,并且docs显示了所有可以使用的参数。