plsql解析文本文件的输出并插入表中

时间:2016-05-17 17:49:48

标签: oracle plsql io

我正在尝试解析外部文件中的文本并将其插入表中。将字符串输入变量 v 之后我试图使用双重分割字符串但不确定如何做到这一点?

我可以遵循哪些方法来解决这个问题以及实现这一目标的最佳方法?

下面我试过,但是在调用'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 个答案:

答案 0 :(得分: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-char列,并且总是只有一行。您没有使用该列,因此它的大小并不重要。您从单行中选择了一个表达式,因此会限制您获得的结果数量。

这个构造可以使用任何单行表,它只是传统的使用dual因为它总是存在已知数量,优化器也知道它可以专门处理所以它比使用自己的表更有效。