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