• ベストアンサー

シェル(Unix/Linux)を使用してDBアクセス

上題どおりなのですが シェルスクリプトを使用してORACLEなどDBへのアクセス・データ操作は 可能なのでしょうか?。 仮にできないとなると、業務系開発ではORACLEとシェルはどのように 組みあわせて使うのでしょうか?。。想像としては ・Oracleのコマンドでデータをテキストに出力しシェルで読みこみ などが考えられますが・・。他にもDB関連で「こんな時にも使う」など ノウハウがあれば是非教えて頂ければと思います。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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にその結果が出力されます。

関連するQ&A

専門家に質問してみよう