显示文件内容,以分隔符分隔

时间:2019-01-04 07:18:59

标签: regex oracle plsql bfile

我正在尝试显示文件内容,并用分隔符分隔。 更确切地说,从this topic开始,我试图将结果显示为:

  

bbb
  aaa
  qqq
  抄送

但要从文件中获取数据源。

直到现在,我一直尝试:

DECLARE
    l_bfile bfile;
BEGIN
    l_bfile := bfilename(my_dir, my_file);
    dbms_lob.fileopen(l_bfile);

    FOR i IN
        (SELECT TRIM(regexp_substr(TO_CHAR(l_bfile),'[^;]+',1,level) ) AS q
         FROM dual
         CONNECT BY regexp_substr(TO_CHAR(l_bfile),'[^;]+',1,level) IS NOT NULL
         ORDER BY level
        )
    LOOP
        dbms_output.put_line(i.q);
    END LOOP;

EXCEPTION
WHEN No_Data_Found THEN
    NULL;
END; 

结果,我得到了

  

PL / SQL:ORA-00932:数据类型不一致:预期有NUMBER个文件

有人可以给我一个提示吗?

2 个答案:

答案 0 :(得分:1)

如果文件包含单行,则可以尝试此操作(因此,有关文件结构的问题):

DECLARE

utlFileHandle  UTL_FILE.FILE_TYPE;
vLine varchar2(100);

BEGIN

utlFileHande := UTL_FILE.FOPEN(my_dir, my_file, 'r');
utl_file.get_line(utlFileHande, vLine);

FOR i IN
    (SELECT TRIM(regexp_substr(vLine,'[^;]+',1,level) ) AS q
     FROM dual
     CONNECT BY regexp_substr(vLine,'[^;]+',1,level) IS NOT NULL
     ORDER BY level
    )
LOOP
    dbms_output.put_line(i.q);
END LOOP;

utl_file.fclose(utlFileHande);

EXCEPTION
WHEN No_Data_Found THEN
   utl_file.fclose(utlFileHande);
   null;
END; 

答案 1 :(得分:1)

必须将其写为新答案,因为它太大了,无法对@SmartDumb进行评论:

请注意,在列表中找到NULL元素时,格式为'[^;]+'(通常用于解析定界列表)的正则表达式将失败。请参阅此帖子以获取更多信息:https://stackoverflow.com/a/31464699/2543416

请使用以下形式的regexp_substr调用(请注意,我删除了第二个元素):

SELECT TRIM(regexp_substr('bbb;;qqq;ccc','(.*?)(;|$)',1,level, null, 1) ) AS q
     FROM dual
     CONNECT BY regexp_substr('bbb;;qqq;ccc','(.*?)(;|$)',1,level) IS NOT NULL
     ORDER BY level

在此示例中它可能重要,也可能不重要,这取决于字符串中元素的顺序对您而言是否重要,或者是否需要保留NULL。也就是说,如果您需要知道第二个元素为NULL,那么它将起作用。

P.S。搜索外部表,看看是否可以使用该解决方案。这样一来,您就可以像查询文件一样查询文件。