Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从文件名中提取数据,并使用存储过程将其存储在表中_Sql_Oracle_Stored Procedures - Fatal编程技术网

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

Sql 从文件名中提取数据,并使用存储过程将其存储在表中,sql,oracle,stored-procedures,Sql,Oracle,Stored Procedures,我在一个目录中有不同类型的文件(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 John in FirstName column

我在一个目录中有不同类型的文件(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      
John in FirstName column  
Doe in LastName column   
19900101 in DOB column  
TX in State column  
whole file in CLOB column
如何在Oracle中编写一个存储过程来读取目录中的文件,并提取
FirstName、LastName、DOB、State
并将其存储在相应列的表中

例如:对于文件
John.Doe.19900101.TX.pdf
,应按如下方式提取数据:

John.Doe.19900101.TX.pdf         //FirstName.LastName.DOB.StateOfResidence  
Bruce.Banner.19700101.PA.doc     
Steve.Rodgers.19760101.AR.csv    
Tony.Stark.19901210.CA.txt      
John in FirstName column  
Doe in LastName column   
19900101 in DOB column  
TX in State column  
whole file in CLOB column

您必须在操作系统级别工作,才能从操作系统目录中收集文件名。考虑到您正试图从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函数应用于拆分信息。您还可以使用regex函数来获取所需的信息

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为
上面粘贴的代码已被修改,在授予目录权限时,您还需要更改用户名。

您将停留在哪个位置,读取目录列表,或将文件名拆分为其组成部分?你做得有多好?如果能把你目前掌握的代码包括进来,以及为什么它没有达到你想要的效果,那会很有帮助。我很抱歉没有提到这个目录不是OS目录。我有目录的路径,需要读取文件名,从文件名中提取值,将这些提取的值与实际文件一起存储在现有表中的CLOB列中。并且regexp_substr()按预期工作。但是,不管文件类型如何,我怎样才能将其与目录中的所有文件循环?@入侵者:如果您遵循上面的代码。它将为您提供作为CREATETABLE命令的结果而创建的外部表中的所有文件名。稍后,当您运行从上面的HOME_DIRECTORY表中选择数据的查询时,它会将文件名分隔为多列。你可以调整你的查询并继续你的结果。类似于从主目录中选择文件名| | | | | | | | | | | | | | | | |文件名| U部分4;别忘了将我的答案标记为正确答案,因为它会为您提供完整的解决方案:)