使用 sql 加载程序将数据从 CSV 文件加载到 oracle table

Loading data from CSV file to oracle table using sql loader

我想在以下条件下将数据从 CSV 文件加载到 oracle table。

如果 table 为空,则只应将数据加载到 table 中,否则不应加载数据。

sql 加载程序是否可以满足此要求?还是我需要使用任何其他 ETL 工具,如 informatica?

无论您在哪个 OS 环境中工作,您可以始终使用 ORACLE_LOADER 使用 External tables 访问驱动程序。

来自 Oracle 文档 Choosing External Tables Versus SQL*Loader

The record parsing of external tables and SQL*Loader is very similar, so normally there is not a major performance difference for the same record format.

您所需要的只是目录对象上的 read/write。如果您可以创建一个(CREATE DIRECTORY YOUR_DIR AS '<directory_path>') 或请求其他超级用户给予适当的资助(GRANT READ ON DIRECTORY YOUR_DIR TO yourschema) 就好了。

可以使用 EXECUTE IMMEDIATE

动态创建外部 Table
DECLARE
     l_exists INT;
BEGIN
SELECT CASE
     WHEN EXISTS ( SELECT 1
                     FROM yourmaintable
                   WHERE ROWNUM = 1
                 ) THEN 1
     ELSE 0 END
into l_exists from dual;

  IF  l_exists : = 0 THEN --If the Table is empty


EXECUTE IMMEDIATE q'{ CREATE TABLE your_ext_table   -- Using the alternate 
                                                    -- quoting mechanism
   (col1         INT,
    col2         VARCHAR2(20)
    col3         DATE)
 ORGANIZATION EXTERNAL
   (TYPE ORACLE_LOADER    -- Use the ORACLE_LOADER driver to load your file.
    DEFAULT DIRECTORY YOUR_DIR
    ACCESS PARAMETERS
      (RECORDS DELIMITED BY NEWLINE
       FIELDS (col1      CHAR(2),
               col2      VARCHAR2(20),
               col3      VARCHAR2(20) date_format DATE mask "mm/dd/yyyy"
              )
      )
    LOCATION ('yourfile.csv')
   )}'
     ;

EXECUTE IMMEDIATE 'INSERT INTO yourmaintable (col1,col2,col3)  --dynamic Insert
                   select * FROM your_ext_table';
END IF;



END;
/

您可以使用加载选项:INSERT来实现它。

It requires the table to be empty before loading. SQL*Loader terminates with an error if the table contains rows.

您可以参考:Loading Data into Empty Tables

干杯!!