使用sql loader将数据从CSV文件加载到oracle表

时间:2019-07-10 05:01:59

标签: sql oracle sql-loader

我想在这种情况下将数据从CSV文件加载到oracle表中。

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

使用sql loader可能有此要求吗?还是我需要使用诸如informatica之类的任何其他ETL工具?

2 个答案:

答案 0 :(得分:2)

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

  

它要求表在装入之前为空。 SQL *加载器   如果表包含行,则终止并显示错误。

您可以参考:Loading Data into Empty Tables

干杯!

答案 1 :(得分:1)

无论您使用哪种操作系统环境,都可以始终使用External tables使用ORACLE_LOADER访问驱动程序。

从Oracle文档Choosing External Tables Versus SQL*Loader

  

外部表和SQL * Loader的记录解析非常相似,   因此通常相同的产品在性能上不会有重大差异   记录格式。

您需要做的只是对目录对象进行读/写。如果您可以创建一个(CREATE DIRECTORY YOUR_DIR AS '<directory_path>')或要求其他超级用户提供适当的授予(GRANT READ ON DIRECTORY YOUR_DIR TO yourschema),则很好。

可以使用EXECUTE IMMEDIATE

动态创建外部表
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;
/