module Sequel::Oracle

Public Class Methods

mock_adapter_setup(db) click to toggle source
# File lib/sequel/adapters/shared/oracle.rb, line 9
def self.mock_adapter_setup(db)
  db.instance_eval do
    @server_version = 11000000
    @primary_key_sequences = {}
  end
end

Public Instance Methods

complex_expression_sql_append(sql, op, args) click to toggle source
# File lib/sequel/adapters/shared/oracle.rb, line 354
def complex_expression_sql_append(sql, op, args)
  case op
  when :&
    complex_expression_arg_pairs_append(sql, args, &BITAND_PROC)
  when :|
    complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)}
  when :^
    complex_expression_arg_pairs_append(sql, args) do |*x|
      s1 = complex_expression_arg_pairs(x){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)}
      s2 = complex_expression_arg_pairs(x, &BITAND_PROC)
      Sequel.lit(["(", " - ", ")"], s1, s2)
    end
  when :~, :'!~', :'~*', :'!~*'
    raise InvalidOperation, "Pattern matching via regular expressions is not supported in this Oracle version" unless supports_regexp?
    if op == :'!~' || op == :'!~*'
      sql << 'NOT '
    end
    sql << 'REGEXP_LIKE('
    literal_append(sql, args[0])
    sql << ','
    literal_append(sql, args[1])
    if op == :'~*' || op == :'!~*'
      sql << ", 'i'"
    end
    sql << ')'
  when :%, :<<, :>>, :'B~'
    complex_expression_emulate_append(sql, op, args)
  else
    super
  end
end
constant_sql_append(sql, c) click to toggle source

Oracle doesn’t support CURRENT_TIME, as it doesn’t have a type for storing just time values without a date, so use CURRENT_TIMESTAMP in its place.

# File lib/sequel/adapters/shared/oracle.rb, line 389
def constant_sql_append(sql, c)
  if c == :CURRENT_TIME
    super(sql, :CURRENT_TIMESTAMP)
  else
    super
  end
end
empty?() click to toggle source

Use a custom expression with EXISTS to determine whether a dataset is empty.

# File lib/sequel/adapters/shared/oracle.rb, line 405
def empty?
  db[:dual].where(@opts[:offset] ? exists : unordered.exists).get(1) == nil
end
except(dataset, opts=OPTS) click to toggle source

Oracle uses MINUS instead of EXCEPT, and doesn’t support EXCEPT ALL

# File lib/sequel/adapters/shared/oracle.rb, line 398
def except(dataset, opts=OPTS)
  raise(Sequel::Error, "EXCEPT ALL not supported") if opts[:all]
  compound_clone(:minus, dataset, opts)
end
recursive_cte_requires_column_aliases?() click to toggle source

Oracle requires recursive CTEs to have column aliases.

# File lib/sequel/adapters/shared/oracle.rb, line 453
def recursive_cte_requires_column_aliases?
  true
end
requires_sql_standard_datetimes?() click to toggle source

Oracle requires SQL standard datetimes

# File lib/sequel/adapters/shared/oracle.rb, line 410
def requires_sql_standard_datetimes?
  true
end
select_sql() click to toggle source

Handle LIMIT by using a unlimited subselect filtered with ROWNUM.

# File lib/sequel/adapters/shared/oracle.rb, line 422
def select_sql
  return super if @opts[:sql]
  if o = @opts[:offset]
    columns = clone(:append_sql=>String.new, :placeholder_literal_null=>true).columns
    dsa1 = dataset_alias(1)
    rn = row_number_column
    limit = @opts[:limit]
    ds = unlimited.
      from_self(:alias=>dsa1).
      select_append(ROW_NUMBER_EXPRESSION.as(rn)).
      from_self(:alias=>dsa1).
      select(*columns).
      where(SQL::Identifier.new(rn) > o)
    ds = ds.where(SQL::Identifier.new(rn) <= Sequel.+(o, limit)) if limit
    sql = @opts[:append_sql] || String.new
    subselect_sql_append(sql, ds)
    sql
  elsif limit = @opts[:limit]
    ds = clone(:limit=>nil)
    # Lock doesn't work in subselects, so don't use a subselect when locking.
    # Don't use a subselect if custom SQL is used, as it breaks somethings.
    ds = ds.from_self unless @opts[:lock]
    sql = @opts[:append_sql] || String.new
    subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit)))
    sql
  else
    super
  end
end
sequence(s) click to toggle source

Create a copy of this dataset associated to the given sequence name, which will be used when calling insert to find the most recently inserted value for the sequence.

# File lib/sequel/adapters/shared/oracle.rb, line 417
def sequence(s)
  clone(:sequence=>s)
end
server_version() click to toggle source

The version of the database server

# File lib/sequel/adapters/shared/oracle.rb, line 527
def server_version
  db.server_version(@opts[:server])
end
supports_cte?(type=:select) click to toggle source
# File lib/sequel/adapters/shared/oracle.rb, line 457
def supports_cte?(type=:select)
  type == :select
end
supports_derived_column_lists?() click to toggle source

Oracle does not support derived column lists

# File lib/sequel/adapters/shared/oracle.rb, line 462
def supports_derived_column_lists?
  false
end
supports_group_cube?() click to toggle source

Oracle supports GROUP BY CUBE

# File lib/sequel/adapters/shared/oracle.rb, line 467
def supports_group_cube?
  true
end
supports_group_rollup?() click to toggle source

Oracle supports GROUP BY ROLLUP

# File lib/sequel/adapters/shared/oracle.rb, line 472
def supports_group_rollup?
  true
end
supports_grouping_sets?() click to toggle source

Oracle supports GROUPING SETS

# File lib/sequel/adapters/shared/oracle.rb, line 477
def supports_grouping_sets?
  true
end
supports_intersect_except_all?() click to toggle source

Oracle does not support INTERSECT ALL or EXCEPT ALL

# File lib/sequel/adapters/shared/oracle.rb, line 482
def supports_intersect_except_all?
  false
end
supports_is_true?() click to toggle source

Oracle does not support IS TRUE.

# File lib/sequel/adapters/shared/oracle.rb, line 487
def supports_is_true?
  false
end
supports_limits_in_correlated_subqueries?() click to toggle source

Oracle does not support limits in correlated subqueries.

# File lib/sequel/adapters/shared/oracle.rb, line 492
def supports_limits_in_correlated_subqueries?
  false
end
supports_offsets_in_correlated_subqueries?() click to toggle source

Oracle does not support offsets in correlated subqueries.

# File lib/sequel/adapters/shared/oracle.rb, line 497
def supports_offsets_in_correlated_subqueries?
  false
end
supports_regexp?() click to toggle source

Oracle supports pattern matching via regular expressions

# File lib/sequel/adapters/shared/oracle.rb, line 532
def supports_regexp?
  server_version >= 10010002
end
supports_select_all_and_column?() click to toggle source

Oracle does not support SELECT *, column

# File lib/sequel/adapters/shared/oracle.rb, line 502
def supports_select_all_and_column?
  false
end
supports_skip_locked?() click to toggle source

Oracle supports SKIP LOCKED.

# File lib/sequel/adapters/shared/oracle.rb, line 507
def supports_skip_locked?
  true
end
supports_timestamp_timezones?() click to toggle source

Oracle supports timezones in literal timestamps.

# File lib/sequel/adapters/shared/oracle.rb, line 512
def supports_timestamp_timezones?
  true
end
supports_where_true?() click to toggle source

Oracle does not support WHERE ‘Y’ for WHERE TRUE.

# File lib/sequel/adapters/shared/oracle.rb, line 517
def supports_where_true?
  false
end
supports_window_functions?() click to toggle source

Oracle supports window functions

# File lib/sequel/adapters/shared/oracle.rb, line 522
def supports_window_functions?
  true
end