我想在这种情况下将数据从CSV文件加载到oracle表中。
如果表为空,则仅应将数据加载到表中,否则不应加载数据。
使用sql loader可能有此要求吗?还是我需要使用诸如informatica之类的任何其他ETL工具?
答案 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;
/