在Oracle中为外部表创建存储(和自动)过程

时间:2018-07-30 15:01:20

标签: oracle csv datatables oracle-sqldeveloper external

首先,预先感谢您的回答。

此问题与外部表和过程有关。

我将在目录中存储一些.csv文件,并且必须将所有这些数据添加到表中。

我的想法是:

  1. 将csv文件数据加载到外部表中

  2. 将所有数据从外部表插入到最终表中

我已经创建了将代码从 csv文件加载到外部表

的代码
    CREATE TABLE "INFO"."DEVICE_EXTERNAL"
    (
        "Serial Number" VARCHAR2(100),
        "Status" VARCHAR2(100),
        "Install Date" VARCHAR2(100)
        )
    ORGANIZATION EXTERNAL 
        ( TYPE ORACLE_LOADER
          DEFAULT DIRECTORY "ER_IN_FILES"
          ACCESS PARAMETERS
          (   RECORDS DELIMITED BY newline 
              SKIP 1 
              FIELDS TERMINATED BY '|' 
              optionally enclosed BY '"' 
              MISSING FIELD VALUES ARE NULL
              (
                "Serial Number" char,
                "Status" char,
                "Install Date" char  
                 ) 
          )
          LOCATION
           ( "INFO":'device_data_week3.csv'   ---csv file
           )
        );

并做了一个将数据从“外部表”加载到“最终表”的过程,如果我还包括了数据移动的实际日期时间。

     Procedure Move_External_Final AS 
        v_upload_date DATE := SYSDATE;
        v_company varchar(1) := '1';  
      BEGIN
       BEGIN

        INSERT INTO SMART_MAP
          (DATA_DATE,
           COMPANY,
           "Serial Number",
           "Status",
           "Install Date"
           )
           SELECT 
            v_upload_date,
            v_company,
            "Serial Number",
            "Status", 
            to_date("Install Date")

        from DEVICE_EXTERNAL    ;  

       COMMIT;

         EXCEPTION
          WHEN no_data_found
            THEN 
            dbms_output.put_line ( 'EXC FAIL INSERT');
       END ;  
      END Move_External_Final;

目标是使一切自动化。因此,我想创建一个过程,使外部表可以从 csv文件中收集数据,然后将这些数据移动到最终表中。

注意 csv文件将每周不同。因此,必须先删除外部表旧内容,然后再收集新数据。

我的问题是:是否可以创建一个程序来删除以前的内容并将数据从csv文件收集到外部表中?

也许有更简单的方法...

再次感谢您!

1 个答案:

答案 0 :(得分:0)

在外部表上创建MATERIALIZE VIEW,并在每次新文件到达时执行完全刷新。

如果有一些文件命名模式,以便文件名发生更改,请在刷新ALTER TABLE之前执行另外的操作以调整文件名的位置。

例如

ALTER TABLE xxx
   LOCATION ('my_new_file');

使用MATERIALIZE VIEW,您无需任何步骤即可刷新数据,只需调用

  dbms_mview.refresh('my_materialzed_view','C');

在后台执行TRUNCATE,然后从外部表进行INSERT APPEND。