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解析文本文件的输出并插入表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 unix scripting/plsql 将文本文件导入 sql 表

oracle plsql:如何解析 XML 并插入到表中

在 python 中解析文本文件并输出到 CSV

通过 PLSQL 打开文本文件而不创建目录

解析文本文件并写出数据

如何设定PLSQL DEVELOPER导出的CSV文件中单元格格式为文本?