从文件名中提取数据并使用存储过程将其存储在表中

问题描述 投票:1回答:1

我在目录中有不同类型的文件(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
sql oracle stored-procedures
1个回答
3
投票

您必须在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;

这会给你:

enter image description here

要使用的URL是here上面粘贴的代码已修改,您需要在授予目录权限的同时更改USER_NAME。

© www.soinside.com 2019 - 2024. All rights reserved.