我在目录中有不同类型的文件(pdf,csv,doc,txt)。
文件名是这样的:
John.Doe.19900101.TX.pdf //FirstName.LastName.DOB.StateOfResidence
Bruce.Banner.19700101.PA.doc
Steve.Rodgers.19760101.AR.csv
Tony.Stark.19901210.CA.txt
如何在Oracle中编写存储过程来读取目录中的文件并提取FirstName, LastName, DOB, State
并将其存储在适当列的表中?
例如:对于文件John.Doe.19900101.TX.pdf
,数据应该像这样提取:
John in FirstName column
Doe in LastName column
19900101 in DOB column
TX in State column
whole file in CLOB column
您必须在OS级别工作才能从OS目录中收集文件名。考虑到你正试图从Unix风格中获取信息;以下URL将帮助您将文件列表抓取到表格甚至视图中。
您需要的代码是:
--drop directory SCRIPT_TEMP_DIR;
CREATE DIRECTORY SCRIPT_TEMP_DIR AS '/home/oracle/oracle_scripts'
;
GRANT EXECUTE ON DIRECTORY SCRIPT_TEMP_DIR TO USER_NAME
; -- Here USER_NAME will be your SCHEMA/USER NAME
drop table USER_NAME.home_directory purge;
CREATE TABLE USER_NAME.home_directory
(
filerecord VARCHAR2(15),
flink VARCHAR2(2),
fowner VARCHAR2(6),
fgroup VARCHAR2(8),
fsize VARCHAR2(32),
fdate_part1 VARCHAR2(16),
fdate_part2 VARCHAR2(16),
fdate_year_or_time VARCHAR2(16),
fname VARCHAR2(255)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY SCRIPT_TEMP_DIR
ACCESS PARAMETERS
(
records delimited by newline
preprocessor SCRIPT_TEMP_DIR:'listing.sh'
fields terminated by whitespace
(
filerecord ,
flink ,
fowner ,
fgroup ,
fsize ,
fdate_part1 ,
fdate_part2 ,
fdate_year_or_time ,
fname
)
)
LOCATION ('listing.sh')
)
REJECT LIMIT UNLIMITED;
完成后,您只需从上面创建的表中进行选择即可。
SELECT *
FROM USER_NAME.home_directory;
稍后您可以应用substr / instr函数来拆分信息。您还可以使用正则表达式函数来获取所需信息。
SELECT fname,
regexp_substr(fname, '[^.]+', 1, 1) part1,
regexp_substr(fname, '[^.]+', 1, 2) part2,
regexp_substr(fname, '[^.]+', 1, 3) part3
FROM USER_NAME.home_directory;
这会给你:
要使用的URL是here上面粘贴的代码已修改,您需要在授予目录权限的同时更改USER_NAME。