Linux 環境で、CSV ファイルから Oracle DB のテーブルに多数のレコードを挿入しようとしています。挿入は簡単です。CSV には、さらに処理するために単一の列テーブルに挿入する必要がある ID があります。
1. ファイルを配列に読み込む 2. 配列内の各項目をループしてテーブルに挿入する
SQL *Loader または DBI を使用できません。DB サーバーへのアクセスが制限されており、DB への接続に使用するホストに追加のパッケージをインストールすることはできません。そのため、利用可能な最も単純なものを使用する必要があります。
これが機能する作品です:
#!/usr/bin/perl
use warnings;
use strict;
my $returnVar;
my $inputfile = $ARGV[0];
# Read file into an array
open(FILE, "<", $inputfile) or die("Unable to open file: $inputfile");
my @idlist = <FILE>;
close(FILE);
#insert array into table
foreach my $id(@idlist)
{
chomp($id);
$returnVar = `sqlplus -s cvo/cvo123\@CVOSTAGE\ <<END
set heading off
set echo off
set feedback off
set pagesize 0
insert into tmp_tx_id values('$id');
exit`;
}
これは、レコードを挿入するたびに接続を開いたり閉じたりする必要があるという意味で問題があります。多数のレコード (> 100 万) を挿入する必要がありますが、これは恐ろしい方法です。次の方法で変更しようとしましたが、成功しません。
.
.
<File has been read into the array>
$returnVar1 = `sqlplus -s cvo/cvo123\@CVOSTAGE\ <<END
set heading off
set echo off
set feedback off
set pagesize 0`;
foreach my $id(@idlist)
{
chomp($id);
$returnVar2 = `insert into tmp_tx_id values(\'$id\');`;
}
system("exit");
どうやら、insert ステートメントは SQL Plus プロンプトでは実行されず、コマンド シェルに移動します。これは私が得るエラーです:
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `insert into tmp_tx_id values('664436565');'
毎回接続を開いたり閉じたりすることなく、複数の Insert ステートメントを実行する方法はありますか? 他の提案 (Perl 以外でも) は大歓迎です。私は学習中のプログラマーです。
ありがとう