データベース内のテーブルをタブ区切り値ファイルにエクスポートする必要があります。Perl と SQL Plus で DBI を使用しています。TSV ファイルへの、または TSV ファイルからのエクスポートおよびインポート(DBI または SQL Plus) をサポートしていますか?
必要に応じてコードを書くことはできますが、既製のソリューションが利用可能であればそれを使用したいと考えています。
タブ区切りの値を持つファイルにテーブルをダンプするのは比較的簡単なはずです。
例えば:
open(my $outputFile, '>', 'myTable.tsv');
my $sth = $dbh->prepare('SELECT * FROM myTable');
$sth->execute;
while (my $row = $sth->fetchrow_arrayref) {
print $outputFile join("\t", @$row) . "\n";
}
close $outputFile;
$sth->finish;
データにタブまたは改行が含まれている場合、これはうまく機能しないことに注意してください。
あなたが提供した情報から、DBIを使用してOracleインスタンスに接続していると思います(sqlplusについて言及したため)。
あなたが示したように「既製の」ソリューションが必要な場合、最善の策は、yasql
Oracle 用の DBD::Oracle ベースのデータベース シェルである " " (Yet Another SQLplus) を使用することです。
yasql には、sql select ステートメントを記述し、出力をそのシェル (Text::CSV_XS が必要です) から直接 CSV ファイルにリダイレクトできる優れた機能があります。
一方、DBD::OracleとText::CSV_XSを使用して独自のスクリプトをロールすることができます。ステートメント ハンドルを準備して実行したら、次の作業を行う必要があります。
$csv->print ($fh, $_) for @{$sth->fetchrow_array};
レコード区切りとしてタブを使用して $csv を初期化したと仮定します。詳細については、Text::CSV_XSドキュメントを参照してください。
awk と sqlplus のみを使用したアプローチを次に示します。awk スクリプトを保存するか、ワンライナーをコピーして貼り付けることができます。フィールドが上書きされないように、HTML 出力モードを使用します。
このスクリプトを sqlplus2tsv.awk として保存します。
# This requires you to use the -M "HTML ON" option for sqlplus, eg:
# sqlplus -S -M "HTML ON" user@sid @script | awk -f sqlplus2tsv.awk
#
# You can also use the "set markup html on" command in your sql script
#
# Outputs tab delimited records, one per line, without column names.
# Fields are URI encoded.
#
# You can also use the oneliner
# awk '/^<tr/{l=f=""}/^<\/tr>/&&l{print l}/^<\/td>/{a=0}a{l=l$0}/^<td/{l=l f;f="\t";a=1}'
# if you don't want to store a script file
# Start of a record
/^<tr/ {
l=f=""
}
# End of a record
/^<\/tr>/ && l {
print l
}
# End of a field
/^<\/td>/ {
a=0
}
# Field value
# Not sure how multiline content is output
a {
l=l $0
}
# Start of a field
/^<td/ {
l=l f
f="\t"
a=1
}
長い文字列と奇妙な文字でこれをテストしませんでしたが、私のユースケースではうまくいきました。進取の気性に富んだ人なら、このテクニックを perl ラッパーに適応させることができます :)
私は過去にそれをしなければなりませんでした...実行したいクエリを渡し、それをsqlplusにパイプするperlスクリプトがあります。ここに抜粋があります:
open(UNLOAD, "> $file"); # Open the unload file.
$query =~ s/;$//; # Remove any trailng semicolons.
# Build the sql statement.
$cmd = "echo \"SET HEAD OFF
SET FEED OFF
SET COLSEP \|
SET LINES 32767
SET PAGES 0
$query;
exit;
\" |sqlplus -s $DB_U/$DB_P";
@array = `$cmd`; # Execute the sql and store
# the returned data in "array".
print $cmd . "\n";
clean(@array); # Remove any non-necessary whitespace.
# This is a method to remove random non needed characters
# from the array
foreach $x (@array) # Print each line of the
{ # array to the unload file.
print UNLOAD "$x\|\n";
}
close UNLOAD; # Close the unload file.
もちろん、上記ではパイプ区切りにしています...タブが必要な場合は、 | の代わりに \t が必要です。プリントで。