我必须使用ctl文件和csv文件将数据插入到oracle数据库中。到目前为止,它是通过使用sqlloader来完成的。但是,我想使用DBI Oracle CPAN来做同样的工作,我问自己如何做到这一点。
下面是一个CTL文件的示例
LOAD DATA
APPEND INTO TABLE DOSSIER
FIELDS TERMINATED BY ';'
(
DSR_IDT,
DSR_CNL,
DSR_PRQ,
DSR_CEN,
DSR_FEN,
DSR_AN1,
DSR_AN2,
DSR_AN3,
DSR_AN4,
DSR_AN5,
DSR_AN6,
DSR_PI1,
DSR_PI2,
DSR_PI3,
DSR_PI4,
DSR_NP1,
DSR_NP2,
DSR_NP3,
DSR_NP4,
DSR_NFL,
DSR_NPG,
DSR_LTP,
DSR_FLF,
DSR_CLR,
DSR_MIM,
DSR_TIM,
DSR_NDC,
DSR_EMS NULLIF DSR_EMS=BLANKS "sysdate",
JOB_IDT,
DSR_STT,
DSR_DAQ "CASE WHEN :DSR_DAQ IS NOT NULL THEN SYSDATE ELSE NULL END"
)这只是一个例子。
我的问题很简单:-通过DBI Oracle CPAN模块,我可以将CSV与CTL文件一起使用吗?-或者,我必须同时重写CSV和CTL文件以生成SQL请求?
发布于 2013-07-12 20:52:48
为了解决这个问题,我简单地为dbi oracle包装器创建了一个附加函数,如下所示:
sub WS_SQL_Loader
{
my ($this, $controlFile, $csvFile, $logFile, $logBadFile) = @_
my $returnVal = 1;
# Récupération des données de connexion Oracle
my $dbi_data_source = $this->{DBLINK};
my $dbi_username = $this->{DBUSER};
my $dbi_password = $this->{DBPASSWORD};
#Préparation de la commande sqlldr a charger
my $command_line = "sqlldr $dbi_username/$dbi_password\@$dbi_data_source data=$csvFile control=$controlFile ".
"log=$logFile bad=$logBadFile silent=ALL";
my $output = `$command_line`;
my $retcode = $? / 256;
# S'il y a eu une erreur => On trace une erreur
if ($retcode ne 0) {
$this->{logger}->createTrace(1310, $logFile);
$returnVal = 0;
} else {
unlink("$logFile");
$this->{logger}->debug("execution de SQL*LOADER. return code => $retcode");
$this->{logger}->debug("execution de SQL*LOADER. commande => sqlldr $dbi_username/<mot de passe>\@$dbi_data_source ".
"data=$csvFile control=$controlFile log=$logFile bad=$logBadFile silent=ALL");
}
# Si le fichier de rejet .bad existe => le sqlldr n'a pas fonctionné
if( -e "$logBadFile" ) {
$this->{logger}->createTrace($ERR_SQL_LDR, $logFile);
$returnVal = 0;
}
return $returnVal;
}但我还没有测试它。
https://stackoverflow.com/questions/17467200
复制相似问题