1

御時間ありがとうございます!

ruby oci8を使用してOracleデータベースに接続し、AWRレポートを生成したいと思います。

コマンドラインからこれを行うと、コードは次のようになります。

sqlplus sys/a@10.69.152.97/load as sysdba
SQL> define num_days = ''
SQL> define report_type = "html"
SQL> define begin_snap = 100
SQL> define end_snap = 101
SQL> define report_name = C:\tttt.html
SQL> @?\rdbms\admin\awrrpt.sql

Rubyを使用してジョブを自動化したいだけです。私はそれをグーグルで検索し、oci8が役立つかもしれないと思います。だから私は次のようにコードを作成します:

require 'oci8'
onn = OCI8.new('sys/a@10.69.152.97/load as sysdba')
conn.exec("define num_days = '';")
conn.exec('define report_type="html"')
onn.exec('define begin_snap = 100')
conn.exec('define end_snap = 101')
conn.exec('define report_name = C:\tttt.html')
conn.exec('@?\rdbms\admin\awrrpt.sql') { |r| puts r}

cmdで実行すると、失敗しました。

失敗したメッセージは次のとおりです。

    Warning: NLS_LANG is not set. fallback to US7ASCII.

    stmt.c:253:in oci8lib_191.so: ORA-00900: invalid SQL statement (OCIError)

    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/ruby-oci8-2.1.2-x86-mingw32/lib/oci8/oci8.rb:474:in `exec'

    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/ruby-oci8-2.1.2-x86-mingw32/lib/oci8/oci8.rb:282:in `exec_internal'

    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/ruby-oci8-2.1.2-x86-mingw32/lib/oci8/oci8.rb:275:in `exec'

    from automate_awr.rb:4:in `<main>'

さらに、oracleに正常にログインし、oci8を使用してselectステートメントを実行できます。

私はどこが間違っていますか?

前もって感謝します!

4

1 に答える 1

1

主な問題は、サーバー側で実行されるはずのクエリと、クライアント側で実行されるsqlplusコマンドを混同することです。

defineコマンドと@コマンドはsqlplusコマンドであり、クライアント側で実行されます。それらはOracleに送信されません。oci8モジュールを使用すると、RubyはOCIを使用してOracleに接続できます。サーバーに任意のクエリを送信できますが、もちろん、sqlplusコマンドを実行することはできません。

「?\ rdbms \ admin」のスクリプトは、sqlplusから実行されることになっています。本当にRubyから実行する必要がある場合は、Ruby Open3モジュールを使用してsqlplusプロセスをフォークし、パイプを使用して入力パラメーターを提供することをお勧めします。

次のコードに基づいて何かを使用できるはずです。

commands = "
  define num_days = ''
  define report_type = 'html'
  define begin_snap = 100
  define end_snap = 101
  define report_name = C:\tttt.html
  @?\rdbms\admin\awrrpt.sql
"
res, s = Open3.capture2e("sqlplus -S sys/a@10.69.152.97/load as sysdba", :stdin_data=>commands)
于 2012-06-23T15:29:51.980 に答える