运行此脚本时:
require 'oci8'
conn = OCI8.new('username', 'password', 'tnsname')
cursor = conn.exec('SELECT 1+1 FROM dual')
while r = cursor.fetch()
puts r.join(',')
end
cursor.close
conn.logoff
出现以下错误消息:
C:/tech/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `initi
alize': wrong number of arguments (2 for 0..1) (ArgumentError)
from C:/tech/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
:36:in `new'
from C:/tech/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
:36:in `require'
from C:/tech/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
:36:in `require'
from C:/tech/Ruby193/lib/ruby/gems/1.9.1/gems/ruby-oci8-2.1.5-x86-mingw3
2/lib/oci8.rb:81:in `<top (required)>'
from C:/tech/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
:60:in `require'
from C:/tech/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
:60:in `rescue in require'
from C:/tech/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
:35:in `require'
from u:/Ruby/test_oci_connect.rb:1:in `<main>'
我可以在SQLPLUS中使用这些凭据,我同时安装了gems和devkit。任何人都可以帮助解决这个问题,或者对下面的答案提供一些清晰的说明吗?
答案 0 :(得分:1)
问题是由Oracle DLL体系结构和Ruby安装不匹配,或者您的系统找不到合适的DLL引起的。
下载Oracle Instant Client。它的重要性在于它与Ruby所在的相同,因为它包含必要的DLL。
将其解压缩到硬盘上的某个位置,例如:
C:/OracleInstantClient添加两者也很方便
/network/admin/sqlnet.ora /network/admin/tnsnames.ora到该文件夹。
将Instant Client的位置添加到系统路径。如果您添加了正确的连接信息,您现在应该可以在没有该错误的情况下进行连接。
答案 1 :(得分:1)
我收到了相同的错误消息,使用了依赖于ruby-oci8的gem(dm-oracle-adapter for datamapper)。 在新环境中按照这些说明重新安装安装程序:
Installing instant client for ruby-oci8
仔细检查路径设置是否正确并重新启动我的ruby控制台。 一切都很完美。
在机器上它没有工作(上面错误的参数错误),我为其他一些服务安装了Oracle 64位dll。我的理论是它与这些dll冲突(Ruby-oci8需要32位DLL),即使路径中没有任何指向这些dll。
另外,如果你在运行'gem install ruby-oci8'时收到警告“ext / oci8 not found”,让我节省你一些时间。在我的情况下,这是一个红色的鲱鱼,并没有影响宝石的功能。
答案 2 :(得分:0)
这个问题似乎与OCI8无关。
由于没有显示整个代码,你在这里误导了我们。
从你的错误堆栈跟踪中,我可以告诉你有一个正在尝试初始化的类,但你已经为该方法定义了一个参数,并且在创建对象时没有提到它。
这实际上意味着你提到了2个参数,它们没有任何东西或只有一个参数。
如果您创建了一个test.rb fiel并粘贴了您自己首先显示的代码,那么它是否有效?