0

我必须使用一些带有 csv 文件的 ctl 文件将数据插入到 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 请求?

4

1 回答 1

0

为了解决这个问题,我只需为 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;
            }

但我还没有测试它。

于 2013-07-12T12:52:48.473 回答