如何从SQLLDR控制文件

时间:2017-11-30 14:26:41

标签: sql stored-procedures sql-loader

我有一个sqlldr进程(从一个Windows批处理触发),它将大约百万条记录加载到一个临时表中。一旦加载完成,需要触发一个SQL包/过程来转换数据。我可以从用于导入数据的同一控制文件中调用包吗?如果是这样,语法是什么?如果不是,实现这个的另一种方法是什么?

1 个答案:

答案 0 :(得分:0)

简短回答:在sqlldr命令之后,使用sqlplus命令在批处理文件中调用所需的程序包/过程,如下例所示。

sqlldr DB_User/DB_Password control=path_of_your_ctl_file.ctl log=path_to_save_log_file.log &

exit | sqlplus DB_User/DB_Password "begin package.procedure; end;" 

长答案:首先,sqlldr的目标是以批处理方式加载大量数据。为此,您可以使用sqlldr命令加载而不转换数据。现在,这并不意味着您不能在sqlldr读取和加载数据的同时转换数据(看下一个示例)。

load data
 infile 'path_of_source_data_file.csv'
 badfile 'path_to_save_bad_file.bad'
 discardfile 'path_to_save_discard_file.dsc'
 append into table TABLE_NAME_TO_STORAGE_DATA
 fields terminated by ';' optionally enclosed by '"' --it depends of data file structure or extension
 TRAILING NULLCOLS
 ( 
   COL_1 "TRIM(:COL_1)", 
   COL_2 "COALESCE(:COL_2, 'UNDEFINED')",
   ID_COL "SEQ_ID_COL.NEXTVAL"
 )

尽管您可以通过sqlldr命令对数据进行规范化,但您必须考虑系统的体系结构。如果标准化阶段很简单(如上述示例),则可以将其放到一个ctl文件中,否则,应在完成数据加载阶段时抽象化标准化阶段并通过sqlplus命令对其进行调用。

注意:另外,您还应该考虑安全性,因为您将数据库用户名和密码传递到了批处理文件中。我建议您使用Powershell文件和Export-Clixml来加密明智的参数(请查看此link以实现此目的)。