アプリ版:「スタンプのみでお礼する」機能のリリースについて

Linuxシェルでの大量データ投入スクリプト

パフォーマンステスト用の大量(数千万件単位)のデータを
DBに投入したいと思っています。
これをLinuxシェルで作成しようと思っています。

今まではsqlplus(あ、DBはoracleです)でログインしてから
複数のSQL文をベタベタ列挙したテキストファイルを読み込んで実行したり
シェルの中で1回ずつコネクションを作成して処理を行なう
というどちらかの方法しか行なったことがありませんでした。
あと、PLSQLで行なう方法もやったことはありますが、今回は
勉強の意味で、Linuxシェルのみを使用して行ないたいと思っています。

今回は、以下の条件・方針で行ないたいと思っています。とりあえず。
・すべてのSQL文を記述するのではなく、レコードごとに変化する
 IDの部分だけをシェルで埋め込む方法にしたい
・コネクションは何度も接続しなおすのではなく、まとめて1回で行ないたい
・ある程度の件数ごと(実質的には500件くらい)にコミットを行ないたい
・とりあえずLinuxシェルでやってみたい
・とりあえずストアドなしでやりたい

途中まで以下のソースを作成しました。
あとはechoの部分を書き換える感じなのですが、
コネクション管理の方法がわからずつまづいています。

まずは、Linuxシェル内でのコネクション管理をすることが出来るのかどうかを
教えてください。もしできるのであればその方法等を教えてください。
出来れば具体的な記述を下記シェルに埋め込む形での解説をお願いしたいです。

よろしくお願いします。


#!/bin/sh

declare -i I=10

echo 【DBコネクション取得】

until [ ${I} -eq 0 ]
do
echo 【ID部分を埋め込んでINSERT文作成】
echo 【INSERT文実行】
if [ `expr ${I} % 3` -eq 0 ]; then
echo 【commit文】
fi
I=${I}-1
done
echo 【commit文】

echo 【DBコネクション切断】

A 回答 (1件)

SQL*Plus で実行するコマンドを標準出力するようにしたものを


パイプを通じて sqlplus に渡せば可能です。
最後に sqlplus の exit コマンドを実行することで
sqlplus から切断されます。

#!/bin/sh

(
I=10
until [ ${I} -eq 0 ]
do
echo 【ID部分を埋め込んでINSERT文作成】
echo 【INSERT文実行】
if [ `expr ${I} % 3` -eq 0 ]; then
echo 【commit文】
fi
I=${I}-1
done
echo 【commit文】
echo exit
) | sqlplus scott/tiger

この回答への補足

このような方法を教えていただいたということは
Javaなどのようにコネクションを取得して
それを扱うということは出来ないのですかね。

補足日時:2010/01/14 17:50
    • good
    • 0
この回答へのお礼

>SQL*Plus で実行するコマンドを標準出力するようにしたものを
>パイプを通じて sqlplus に渡せば可能です。

なるほど!
発想の転換みたいな感じですね。
もしかしたら普通のことなのかもしれませんが、
自分の頭になかった考えなので、「なるほど」と思いました。

ものすごく大量のSQL文を送信することになるので
その点は気になりますが、やりたいことは達成できそうです。

大変参考になりました。
ありがとうございました。

お礼日時:2010/01/14 17:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!