2009-04-16 2 views
6

Первый подход: Голый металлКак подключиться к Oracle с использованием JRuby & JDBC

require 'java' 
require 'rubygems' 
require "c:/ruby/jruby-1.2.0/lib/ojdbc14.jar" # should be redundant, but tried it anyway 
odriver = Java::JavaClass.for_name("oracle.jdbc.driver.OracleDriver") 
puts odriver.java_class 
url = "jdbc:oracle:thin:@myhost:1521:mydb" 
puts "About to connect..." 
con = java.sql.DriverManager.getConnection(url, "myuser", "mypassword"); 
if con 
    puts " connection good" 
else 
    puts " connection failed" 
end 

Результат вышеперечисленное:

sqltest.rb:4: cannot load Java class oracle.jdbc.driver.OracleDriver (NameError) 

Второй подход: Active Record

require 'rubygems' 
gem 'ActiveRecord-JDBC' 
require 'jdbc_adapter' 
require 'active_record' 
require 'active_record/version' 
require "c:/ruby/jruby-1.2.0/lib/ojdbc14.jar" # should be redundant... 

ActiveRecord::Base.establish_connection(
    :adapter => 'jdbc', 
    :driver => 'oracle.jdbc.driver.OracleDriver', 
    :url => 'jdbc:oracle:thin:@myhost:1521:mydb', 
    :username=>'myuser', 
    :password=>'mypassword' 
) 
ActiveRecord::Base.connection.execute("SELECT * FROM mytable") 

Результатом этого является:

C:/ruby/jruby-1.2.0/lib/ruby/gems/1.8/gems/activerecord-jdbc-adapter-0.9.1/lib/active_recordconnection_adapters/jdbc_adapter.rb:330:in `initialize': 
The driver encountered an error: cannot load Java class oracle.jdbc.driver.OracleDriver (RuntimeError) 

По существу такая же ошибка, независимо от того, как я это делаю.

Я использую JRuby 1.2.0 и у меня есть ojdbc14.jar в моем каталоге Lib JRuby

Gems:

  • ActiveRecord-JDBC (0,5)
  • ActiveRecord-JDBC-адаптер (0.9.1)
  • ActiveRecord (2.2.2)

Что мне не хватает?

Спасибо,

+0

Я бы интересно посмотреть, если SO может бить рубиновый форум (http://www.ruby-forum.com/topic/ 184414) –

+0

Первоначально опубликовано в Nabble http://www.nabble.com/Having-problems-accessing-Oracle-td23070394.html Я предполагаю, что они дошли до Ruby Forum каким-то образом ... – Rob

ответ

5

Оказывается, мой файл ojdbc14.jar был поврежден.

Кроме того, файл jar ДОЛЖЕН быть в каталоге jruby/lib. Просто наличие этого в classpath не работает.

+0

появляется в эти дни, когда его в переменной (jruby specific) CLASSPATH тоже достаточно, но просто выполнить требование «ojdbc14.jar» нет. – rogerdpack

+0

также кажется, что в эти дни вам просто нужно потребовать банку, она больше не должна быть в каталоге lib (1.6.0RC2) – rogerdpack

0

У вас установлен клиент Oracle? вам, вероятно, понадобятся хотя бы файлы драйвера jdbc от клиента

+0

Да, но я не думал, что это потребуется с этим «тонким» типом соединения. – Rob

+0

Да, банку обычно достаточно. – rogerdpack

5
 
require 'java' 

# This require doesn't load the jdbc driver jar into the system class path 
require "c:/ruby/jruby-1.2.0/lib/ojdbc14.jar" 

# 2 ways you can load the class (There are probably more) 

# 1 ruby syntax for java class name 
Java::OracleJdbcDriver::OracleDriver 

# 2 Use the thread context class loader 
java.lang.Class.forName("oracle.jdbc.driver.OracleDriver", true, java.lang.Thread.currentThread.getContextClassLoader) 


url = "jdbc:oracle:thin:@myhost:1521:mydb" 
puts "About to connect..." 
con = java.sql.DriverManager.getConnection(url, "myuser", "mypassword"); 
if con 
    puts " connection good" 
else 
    puts " connection failed" 
end 
+0

Теперь я использую ваш пример, но я не понимаю, как я будут запускать команды. Не могли бы вы вернуться ко мне? – user3505901

3

, а затем использовать его после создания:

 
b = con.create_statement 
rs=b.execute_query(“select BANNER from SYS.V_$VERSION”) 
while(rs.next()) 
    p rs.getObject(1) # get first column 
end 
rs.close 

and how to deal with oracle timestamps (if column 3 is a timestamp, for example): 

>> rs.getObject(3).timestamp_value.to_string 
=> “1970-01-01 00:00:01.0″ 
>> Date.parse(rs.getObject(3).timestamp_value.to_string) 
# or you can use time, like 
>> as_ruby_time= Date.parse(rs.getObject(3).timestamp_value.to_string).to_time # 1.9 has this method 
# or 
>> as_ruby_time = Time.at(0) + rs.getObject(3).timestamp_value.get_time