错误 - Ruby OCI8 - 参数数量错误(0为1时为2)

时间:2013-05-29 07:52:08

标签: sql ruby oracle oci8

运行此脚本时:

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。任何人都可以帮助解决这个问题,或者对下面的答案提供一些清晰的说明吗?

3 个答案:

答案 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并粘贴了您自己首先显示的代码,那么它是否有效?