KEMBAR78
Rails on Oracle 2011 | PDF
Rails on Oracle
Raimonds Simanovskis


       github.com/rsim




          @rsim
Self-promotion :)   eazybi.com
How to contribute to
  ActiveRecord
 Oracle enhanced
     adapter
Main components
                          Rails 3.x
                          build query
 ActiveRecord                                   Arel
                               SQL
                                        Arel::Visitors::Oracle
               execute
     results




OracleEnhancedAdapter

      ActiveRecord::
   ConnectionAdapters::
     AbstractAdapter
What Oracle Enhanced
      adapter does
  database         metadata       custom CUD
 connection        queries         procedures

                   schema            custom
value quoting
                definition stmts   schema stmts

column type                       context index
                schema dump
  mapping                           creation

results type       structure
                                   AR patches
  mapping            dump
Oracle Data Types
    Ruby            Rails             Oracle
    Fixnum          :integer        NUMBER
     Float             :float        NUMBER
  BigDecimal       :decimal      NUMBER, DECIMAL
     Time         :datetime          DATE
     Time              :time         DATE
     Date              :date         DATE
     String           :string      VARCHAR2
     String            :text         CLOB
     String          :binary         BLOB
True/FalseClass    :boolean     NUMBER(1), CHAR(1)
Latest addition
Ruby     Rails   Oracle
String   :raw    RAW
Legacy schemas
class Employee < ActiveRecord::Base
  set_table_name "hr_employees"
  set_primary_key "employee_id"
  set_sequence_name "hr_employee_s"

  set_date_columns :hired_on, :birth_date_on
  set_datetime_columns :last_login_time

  set_boolean_columns :manager, :active

  ignore_table_columns :attribute1, :attribute2
end
class Employee < ActiveRecord::Base
             set_create_method do
               plsql.employees_pkg.create_employee(
                 :p_first_name => first_name,

ActiveRecord     :p_last_name => last_name,
                 :p_employee_id => nil
               )[:p_employee_id]
     with    end
             set_update_method do

   PL/SQL      plsql.employees_pkg.update_employee(
                 :p_employee_id => id,
                 :p_first_name => first_name,
   CRUD        )
                 :p_last_name => last_name


 procedures  end
             set_delete_method do
               plsql.employees_pkg.delete_employee(
                 :p_employee_id => id
               )
             end
           end
Full-text indexes
add_context_index :posts,
  [:title, :body,
  # specify aliases always with AS keyword
  "SELECT comments.author AS comment_author, " +
          "comments.body AS comment_body " +
  "FROM comments WHERE comments.post_id = :id" ],
  :name => 'post_and_comments_index',
  :index_column => :all_text,
  :index_column_trigger_on => [:updated_at, :comments_count],
  :sync => 'ON COMMIT'


Post.contains(:all_text, "hello")
Post.contains(:all_text, "{first} within title")
Post.contains(:all_text, "{first} AND {post}")
Gemfile

gem “ruby-oci8”, “~>2.0.4”
gem “activerecord-oracle_enhanced-adapter”, “~>1.3.2”



gem “activerecord-oracle_enhanced-adapter”,
  :git=> “git://github.com/rsim/oracle-enhanced.git”
Currently testing on
ActiveRecord versions
        2.3.x
        3.0.x
      3.1.beta
Currently testing on
 Oracle versions
     10.2.0.4

 11gR2 should be
     OK :)
Currently testing on
  Ruby platforms
          oracle_enhanced adapter




  Ruby 1.8.7        Ruby 1.9.2      JRuby 1.6

ruby-oci8 2.0.4   ruby-oci8 2.0.4   ojdbc6.jar
Reporting issues
Where?

 http://github.com/rsim/oracle-enhanced/issues


http://groups.google.com/group/oracle-enhanced
How?
      Provide full example
require "rubygems"
gem "activerecord", "3.0.5"
gem "activerecord-oracle_enhanced-adapter", "1.3.2"
require "active_record"

ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced",
  :database => "orcl", :username => "hr", :password => "hr")

ActiveRecord::Base.connection.instance_eval do
  drop_table :test_categories rescue nil
  create_table :test_categories, :force => true do |t|
    t.string :name
    t.string :category_code
  end
end

class TestCategory < ActiveRecord::Base
end

category = TestCategory.new(:name=>"hl", :category_code=>"hd")
category.id = 1
category.save!

p category
Ideally
Github pull request
Other libraries
ruby-plsql gem
plsql.connect! "hr","hr","xe"

plsql.test_uppercase('xxx')              # => "XXX"
plsql.test_uppercase(:p_string => 'xxx') # => "XXX"
plsql.test_copy("abc", nil, nil)         # => { :p_to => "abc",
                                         # :p_to_double => "abcabc" }
plsql.test_copy(:p_from => "abc", :p_to => nil, :p_to_double => nil)
                                         # => { :p_to => "abc",
                                         # :p_to_double => "abcabc" }
plsql.hr.test_uppercase('xxx')           # => "XXX"
plsql.test_package.test_uppercase('xxx') # => 'XXX'
plsql.hr.test_package.test_uppercase('xxx') # => 'XXX'

plsql.logoff
ruby-plsql-spec
                ideal language
                for writing tests

             powerful testing tools
 RSpec       with “readable” syntax

               library for calling
ruby-plsql    PL/SQL procedures
                   from Ruby
http://github.com/rsim/mondrian-olap
More information
         http://blog.rayapps.com


 http://github.com/rsim/oracle-enhanced


http://groups.google.com/group/oracle-enhanced

Rails on Oracle 2011

  • 1.
  • 2.
    Raimonds Simanovskis github.com/rsim @rsim
  • 3.
  • 4.
    How to contributeto ActiveRecord Oracle enhanced adapter
  • 5.
    Main components Rails 3.x build query ActiveRecord Arel SQL Arel::Visitors::Oracle execute results OracleEnhancedAdapter ActiveRecord:: ConnectionAdapters:: AbstractAdapter
  • 6.
    What Oracle Enhanced adapter does database metadata custom CUD connection queries procedures schema custom value quoting definition stmts schema stmts column type context index schema dump mapping creation results type structure AR patches mapping dump
  • 7.
    Oracle Data Types Ruby Rails Oracle Fixnum :integer NUMBER Float :float NUMBER BigDecimal :decimal NUMBER, DECIMAL Time :datetime DATE Time :time DATE Date :date DATE String :string VARCHAR2 String :text CLOB String :binary BLOB True/FalseClass :boolean NUMBER(1), CHAR(1)
  • 8.
    Latest addition Ruby Rails Oracle String :raw RAW
  • 9.
    Legacy schemas class Employee< ActiveRecord::Base set_table_name "hr_employees" set_primary_key "employee_id" set_sequence_name "hr_employee_s" set_date_columns :hired_on, :birth_date_on set_datetime_columns :last_login_time set_boolean_columns :manager, :active ignore_table_columns :attribute1, :attribute2 end
  • 10.
    class Employee <ActiveRecord::Base set_create_method do plsql.employees_pkg.create_employee( :p_first_name => first_name, ActiveRecord :p_last_name => last_name, :p_employee_id => nil )[:p_employee_id] with end set_update_method do PL/SQL plsql.employees_pkg.update_employee( :p_employee_id => id, :p_first_name => first_name, CRUD ) :p_last_name => last_name procedures end set_delete_method do plsql.employees_pkg.delete_employee( :p_employee_id => id ) end end
  • 11.
    Full-text indexes add_context_index :posts, [:title, :body, # specify aliases always with AS keyword "SELECT comments.author AS comment_author, " + "comments.body AS comment_body " + "FROM comments WHERE comments.post_id = :id" ], :name => 'post_and_comments_index', :index_column => :all_text, :index_column_trigger_on => [:updated_at, :comments_count], :sync => 'ON COMMIT' Post.contains(:all_text, "hello") Post.contains(:all_text, "{first} within title") Post.contains(:all_text, "{first} AND {post}")
  • 12.
    Gemfile gem “ruby-oci8”, “~>2.0.4” gem“activerecord-oracle_enhanced-adapter”, “~>1.3.2” gem “activerecord-oracle_enhanced-adapter”, :git=> “git://github.com/rsim/oracle-enhanced.git”
  • 13.
    Currently testing on ActiveRecordversions 2.3.x 3.0.x 3.1.beta
  • 14.
    Currently testing on Oracle versions 10.2.0.4 11gR2 should be OK :)
  • 15.
    Currently testing on Ruby platforms oracle_enhanced adapter Ruby 1.8.7 Ruby 1.9.2 JRuby 1.6 ruby-oci8 2.0.4 ruby-oci8 2.0.4 ojdbc6.jar
  • 16.
  • 17.
  • 18.
    How? Provide full example require "rubygems" gem "activerecord", "3.0.5" gem "activerecord-oracle_enhanced-adapter", "1.3.2" require "active_record" ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced", :database => "orcl", :username => "hr", :password => "hr") ActiveRecord::Base.connection.instance_eval do drop_table :test_categories rescue nil create_table :test_categories, :force => true do |t| t.string :name t.string :category_code end end class TestCategory < ActiveRecord::Base end category = TestCategory.new(:name=>"hl", :category_code=>"hd") category.id = 1 category.save! p category
  • 19.
  • 20.
  • 21.
    ruby-plsql gem plsql.connect! "hr","hr","xe" plsql.test_uppercase('xxx') # => "XXX" plsql.test_uppercase(:p_string => 'xxx') # => "XXX" plsql.test_copy("abc", nil, nil) # => { :p_to => "abc", # :p_to_double => "abcabc" } plsql.test_copy(:p_from => "abc", :p_to => nil, :p_to_double => nil) # => { :p_to => "abc", # :p_to_double => "abcabc" } plsql.hr.test_uppercase('xxx') # => "XXX" plsql.test_package.test_uppercase('xxx') # => 'XXX' plsql.hr.test_package.test_uppercase('xxx') # => 'XXX' plsql.logoff
  • 22.
    ruby-plsql-spec ideal language for writing tests powerful testing tools RSpec with “readable” syntax library for calling ruby-plsql PL/SQL procedures from Ruby
  • 23.
  • 24.
    More information http://blog.rayapps.com http://github.com/rsim/oracle-enhanced http://groups.google.com/group/oracle-enhanced