从pl sql过程读取分隔文件

时间:2017-04-25 06:49:53

标签: oracle plsql

我是pl sql的新手并尝试读取文件(列式),其中file(abc.txt)的数据由管道“|”分隔如下所示:

 first test|add|123
 second test|mod|654

所以我的要求就像

  • 我们如何在pl sql程序中读取上述文件。

工作示例代码将非常有用。

以及用于读取文件的代码:

set serveroutput on;

DECLARE 
    V1 VARCHAR2(200);
    F1 UTL_FILE.FILE_TYPE;
    V1 VARCHAR2(200);
    F1 UTL_FILE.FILE_TYPE; 
BEGIN 
    F1 := UTL_FILE.FOPEN('USER_DIR','abc.txt','R');

    LOOP
        BEGIN
            UTL_FILE.GET_LINE(F1,V1);
            dbms_output.put_line(V1);
        EXCEPTION
            WHEN no_data_found THEN EXIT;
        END;
    END LOOP;

    IF UTL_FILE.IS_OPEN(F1) THEN
        dbms_output.put_line('File is Open');
    end if;
    UTL_FILE.FCLOSE(F1);
 END;
/

1 个答案:

答案 0 :(得分:0)

解决方案1:sqlloader

  1. 为传入数据创建表

  2. 定义您的"加载规则":

    Use LOAD DATA
      infile '/yourappli/utl_file/abc.txt'
          REPLACE
          INTO TABLE LOAN_BALANCE_MASTER_INT
          fields terminated by '|' optionally enclosed by '"'
          (
            Col_1,
            Col_2,
            Col_3
          )
    
  3. 解决方案2:将每个分隔的字符串转换为集合

    以下是如何使用文档链接中声明的 V1函数在代码中循环分隔字符串 cto_table

    DECLARE 
      V1 VARCHAR2(200);
      F1 UTL_FILE.FILE_TYPE;
    BEGIN 
      F1 := UTL_FILE.FOPEN('USER_DIR','abc.txt','R');
      Loop
      BEGIN
        UTL_FILE.GET_LINE(F1,V1);
          for x in ( 
            select column_value a from  table(cto_table('|', V1) )
          ) loop
            dbms_output.put_line(x.a);
          end loop;
      EXCEPTION WHEN No_Data_Found 
       THEN EXIT; 
      END;
      end loop;
      IF UTL_FILE.IS_OPEN(F1) THEN
        dbms_output.put_line('File is Open');
      end if;
      UTL_FILE.FCLOSE(F1);
    END;
    /