显示由定界符分割的文件内容
display the content of a file split by a delimiter character
我正在尝试显示文件的内容,用定界符分隔。
更确切地说,从 开始,我试图将结果显示为:
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: inconsistent datatypes: expected NUMBER got FILE
谁能给我一个提示,好吗?
如果您的文件包含单行,您可以试试这个(因此关于文件结构的问题):
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;
必须将此写为新答案,因为这对于@SmartDumb 的评论来说太大了:
请注意,当在列表中找到 NULL 元素时,'[^;]+'
形式的正则表达式(通常用于解析定界列表)会失败。请参阅此 post 了解更多信息:
请使用这种形式调用 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。搜索外部 tables 并查看这是否是您可以使用的解决方案。那会让你查询一个文件,就好像它是一个 table.
我正在尝试显示文件的内容,用定界符分隔。
更确切地说,从
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: inconsistent datatypes: expected NUMBER got FILE
谁能给我一个提示,好吗?
如果您的文件包含单行,您可以试试这个(因此关于文件结构的问题):
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;
必须将此写为新答案,因为这对于@SmartDumb 的评论来说太大了:
请注意,当在列表中找到 NULL 元素时,'[^;]+'
形式的正则表达式(通常用于解析定界列表)会失败。请参阅此 post 了解更多信息:
请使用这种形式调用 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。搜索外部 tables 并查看这是否是您可以使用的解决方案。那会让你查询一个文件,就好像它是一个 table.