PL / SQL从文本文件中提取列

时间:2016-04-15 06:34:06

标签: sql oracle parsing plsql

我有一个包含多行的文本文件。我想用PL / SQL从每行的相同位置选择一个子串。 我怎么能这样做?

示例:

这是我的文字档案:

function_name

我想使用PL / SQL在每行上提取2-4列,所以我的结果应该是这样的:

ABCDEFGHI
JKLMNOPQR

2 个答案:

答案 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;
/