我有一个包含多行的文本文件。我想用PL / SQL从每行的相同位置选择一个子串。 我怎么能这样做?
示例:
这是我的文字档案:
function_name
我想使用PL / SQL在每行上提取2-4列,所以我的结果应该是这样的:
ABCDEFGHI
JKLMNOPQR
答案 0 :(得分:1)
根据您的目标,您可以使用多种方法处理Oracle中的文件。
第一个选项
假设您要做的只是阅读文件,然后再做一些额外的处理
1)用UTL_FILE
读取文件
http://docs.oracle.com/database/121/ARPLS/u_file.htm#ARPLS72681
2)
使用substring
功能提取列2-4
例如select substr('ABCDEFGHI',2,3) from dual;
第二个选项
如果你直接从文件中插入一个表格,你需要的只是格式化我建议你使用 SQL Loader
e.g。
load data infile 'data.csv'
append into table mytable
fields terminated by ","
(
str "substr(:str,2,3)",
)
第三选项
如果您想直接访问SQL中的文件并使用它 - 例如在视图中 - 那么您可能会从外部表中获益
http://docs.oracle.com/database/121/SUTIL/GUID-ACF1D3AA-1D61-4682-AEC5-42C944756E12.htm#SUTIL1357
答案 1 :(得分:0)
1)首先,您需要为Oracle用户创建一个Oracle目录,该用户将读取文件或授予现有权限:
CREATE OR REPLACE DIRECTORY file_dir AS '/your/directory/';
Permissions:
GRANT READ ON DIRECTORY file_dir TO YOU_USER;
2)将文件复制到'/ your / directory /'文件夹
3)运行代码,如下所示:
Create or Replace PROCEDURE Readfile is
fileForRead UTL_FILE.FILE_TYPE;
line VARCHAR2(200);
BEGIN
f := UTL_FILE.FOPEN(file_dir ,'your_file.txt','R');
IF UTL_FILE.IS_OPEN(fileForRead) THEN
LOOP
BEGIN
UTL_FILE.GET_LINE(fileForRead,line);
IF line IS NULL THEN
EXIT;
END IF;
line := substr(line, 2,3);
END LOOP;
COMMIT;
END IF;
END;
/