2012-06-23 3 views
1

Спасибо за ваше время!ruby ​​oci8 generate oracle AWR report

Я хочу использовать ruby ​​oci8 для подключения к базе данных оракула для создания отчета AWR.

Когда я делаю это через командную строку, код выглядит так:

sqlplus sys/[email protected]/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. Я google это и найти oci8 может помочь. Поэтому я просто формирую свои коды:

require 'oci8' 
onn = OCI8.new('sys/[email protected]/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>' 

Кроме того, я могу успешно войти в оракула и выполнить оператор выбора с помощью oci8.

Где я ошибаюсь?

Заранее благодарен!

ответ

1

Основная проблема заключается в том, что вы создаете путаницу между запросами, которые должны выполняться на стороне сервера, и командами sqlplus, которые должны выполняться на стороне клиента.

Команды define и @ представляют собой команды sqlplus, выполняемые на стороне клиента. Они не отправляются в Oracle. С модулем oci8 Ruby может подключаться к Oracle с использованием OCI. Он может отправлять любые запросы на сервер, но, конечно, он не сможет запускать команды 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/[email protected]/load as sysdba", :stdin_data=>commands) 
+0

Спасибо большое! Я понимаю, где я сейчас неправ. Сначала я буду исследовать popen3 и дам сообщение о задаче, когда я это сделаю. – mCY

Смежные вопросы