谢谢你的时间!
我想使用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>'
此外,我可以使用oci8成功登录oracle并执行select语句。
我哪里错了?
提前致谢!
答案 0 :(得分: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)