電子書籍の厳選無料作品が豊富!

上題どおりなのですが

シェルスクリプトを使用してORACLEなどDBへのアクセス・データ操作は
可能なのでしょうか?。

仮にできないとなると、業務系開発ではORACLEとシェルはどのように
組みあわせて使うのでしょうか?。。想像としては

・Oracleのコマンドでデータをテキストに出力しシェルで読みこみ

などが考えられますが・・。他にもDB関連で「こんな時にも使う」など
ノウハウがあれば是非教えて頂ければと思います。

よろしくお願いします。

A 回答 (1件)

>シェルスクリプトを使用してORACLEなど


>DBへのアクセス・データ操作は
>可能なのでしょうか?。

は可能です。ぐだぐだ説明するより例を示した方が
分かり易いと思うので...

#!/bin/sh
sqlplus system/manager@ORACLE_SID << EOF
select table_name from user_tables;
EOF #必ず行頭に!!

要するにEOFとEOFの間にSQL*Plus上で実行したい
コマンドを入力するだけです。
ここで気をつけないといけないのは2つ目の終わり
を示すEOFは必ず行頭に記述しなくてはいけない
という点です。
if文やwhile文の中で使うときについついインデント
をつけてしまいますが閉じる意味のEOFは必ず
行頭です。

ただ、業務系開発となるとあまりシェルスクリプト
でプログラムを開発することは少ないかと思います。
理由は2つあって

1.性能が悪い
2.セキュリティ的に好ましくない

1はシェルスクリプトでDBにアクセスする場合、
SQL*Plusで接続することが多くなりますが、SQL*Plus
は管理用モジュールの意味合いが強く、あまり
アクセスの最適化は計られていません。
よって同じ命令を投げてもPro*CやOCIと比較して
性能は良くないです。
また、シェルは実行毎にコンパイルが行われるので
それもあまりよろしくありません。

2はサーバ側にviなどで簡単に開けるtext形式ファイル
として配置するためサーバにさえログインすれば
どういった処理が行われているのかが簡単に把握でき、
やろうと思えば書き換えだってできてしまいます。
Pro*Cプリコンパイル、Cコンパイルなどを行えば
ロードモジュール化されるので実行はできても
内容の閲覧や修正は不可能です。
またご存知かもしれませんがOracleには
ストアドプロシージャという昨日もあり、
事前にコンパイル済みの状態でOracleのメモリ領域に
プログラムを常駐させておくことも可能です。

シェルスクリプトによるSQL*Plus経由のOracleアクセス
は主に非定期、非定型で行われるDB管理などに
用いると思ったほうがよいかと思います。

>Oracleのコマンドでデータをテキストに出力しシェルで読みこみ
はちょっと意味がよく分からないのですが、
Oracleの出力結果をログファイルに
吐き出したいのであればSQL*Plusであれば一番最初に
spool log.txt
と入力しておけばそれ以降の出力はlog.txtに出力
されます。
先述したEOFを使う場合は

#!/bin/sh
sqlplus system/manager@ORACLE_SID << EOF > log.txt
select table_name from user_tables;
EOF #必ず行頭に!!

としても同様にlog.txtにその結果が出力されます。
    • good
    • 0

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