首页 > 解决方案 > 在 Oracle 中为外部表创建存储(和自动化)过程

问题描述

首先,提前感谢您的回答。

这个问题是关于外部表和过程的。

我将一些 .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
           )
        );

并制定了将数据从 External Table 加载到 Final Table的程序,我是否还包括数据移动的实际日期时间。

     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;

目的是让一切自动化。因此,我想创建一个程序,允许 External Table 从csv 文件收集数据,然后将这些数据移动到 Final Table

注意csv 文件每周都会有所不同。因此,在收集新数据之前,必须删除外部表的旧内容。

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

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

再次感谢你!

标签: oraclecsvdatatablesoracle-sqldeveloperexternal

解决方案


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

如果有一些文件命名模式,因此文件名发生变化,请在刷新之前另外执行ALTER TABLE以调整文件名位置。

例如

ALTER TABLE xxx
   LOCATION ('my_new_file');

使用 MATERIALIZE VIEW,您不需要任何程序来刷新数据,只需调用

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

在后台执行 TRUNCATE,然后执行来自外部表的 INSERT APPEND。


推荐阅读