0

我正在尝试显示文件的内容,由分隔符分隔。更确切地说,从这个主题开始,我试图将结果显示为:

bbb
aaa
qqq
ccc

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

到目前为止,我尝试过:

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 得到 FILE

谁能给我一个提示,好吗?

4

2 回答 2

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; 
于 2019-01-04T08:40:49.490 回答
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,那么这将起作用。

PS 搜索外部表,看看这是否是您可以使用的解决方案。这将使您可以像查询表一样查询文件。

于 2019-01-08T16:26:13.167 回答