我想在以下条件下将数据从CSV文件加载到oracle表。
如果表为空,则只应将数据加载到表中,否则不应加载数据。
SQL 加载程序是否满足此要求? 还是我需要使用任何其他 ETL 工具,如 informatica?
加载选项:INSERT
来实现它。
它要求表在加载之前为空。SQL*Loader 如果表包含行,则终止并显示错误。
您可以参考:将数据加载到空表中
干杯!!
无论您在哪个操作系统环境中工作,您都可以始终使用外部表ORACLE_LOADER
访问驱动程序。
来自 Oracle 文档选择外部表与 SQL*加载程序
外部表和 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;
/