plsql解析文本文件的输出并插入表
Posted
技术标签:
【中文标题】plsql解析文本文件的输出并插入表【英文标题】:plsql parsing the output from text file and insert into table 【发布时间】:2016-05-17 17:49:48 【问题描述】:我正在尝试解析外部文件中的文本并将其插入表中。将字符串放入变量 v 后,我尝试使用 dual 拆分字符串,但不知道该怎么做?
我可以采用哪些替代方案来解决这个问题以及实现这个问题的最佳方法?
下面我尝试了,但给出的错误是 “在调用 'PUT_LINE' 时参数的数量或类型错误”,我知道 putline 无法显示行类型,那么问题是我应该声明什么用于捕获双重语句输出的变量声明?
另外我的问题是关于描述显示为 varchar2(1) 的双重问题,那么它应该如何保存到一些 varchar 中?
请解释一下?
set serveroutput on;
create or replace directory USER_DIR as 'e:\projects\sql';
declare
v varchar2(200);
f utl_file.file_type;
element varchar2(200);
begin
f := utl_file.fopen('USER_DIR','test.txt','R');
if utl_file.is_open(f) then
loop
begin
utl_file.get_line(f,v);
dbms_output.put_line(v);
for element in (select regexp_substr(v,'[^\t]+',1,level) from dual connect by regexp_substr(v,'[^\t]+',1,level) is not null)
loop
begin
dbms_output.put_line(element);
end;
end loop;
exception when no_data_found then exit;
end;
end loop;
end if;
utl_file.fclose(f);
end;
/
set serveroutput off;
【问题讨论】:
这是作业吗?如果没有,您是否考虑过使用外部表? 【参考方案1】:您需要给生成的expression 一个列别名,然后将该名称作为记录字段引用:
for elements in (select regexp_substr(v,'[^\t]+',1,level) as element
from dual connect by regexp_substr(v,'[^\t]+',1,level) is not null)
loop
begin
dbms_output.put_line(elements.element);
end;
end loop;
未使用您明确声明的element
变量;循环变量名称会覆盖它。
dual
表有一个名为 dummy
的 1 字符列,并且始终只有一行。您没有使用该列,因此它的大小无关紧要。您正在从单行中选择一个表达式,因此会限制您获得的结果数量。
这个构造可以使用任何单行表,它只是传统的使用dual
,因为它总是作为一个已知数量存在,优化器也知道它可以特殊处理,因此它比使用你自己的更有效表。
【讨论】:
以上是关于plsql解析文本文件的输出并插入表的主要内容,如果未能解决你的问题,请参考以下文章