module Sequel::Oracle::DatasetMethods

Constants

APOS
APOS_RE
BITCOMP_CLOSE
BITCOMP_OPEN
BOOL_FALSE
BOOL_TRUE
DOUBLE_APOS
DUAL
FROM
HSTAR
ILIKE_0
ILIKE_1
ILIKE_2
ILIKE_3
LIKE
NOT_LIKE
ROW_NUMBER_EXPRESSION
SELECT_CLAUSE_METHODS
SPACE
TIMESTAMP_FORMAT
TIMESTAMP_OFFSET_FORMAT

Public Instance Methods

complex_expression_sql_append(sql, op, args) click to toggle source

Oracle needs to emulate bitwise operators and ILIKE/NOT ILIKE operators.

# File lib/sequel/adapters/shared/oracle.rb, line 234
def complex_expression_sql_append(sql, op, args)
  case op
  when :&
    sql << complex_expression_arg_pairs(args){|a, b| "CAST(BITAND(#{literal(a)}, #{literal(b)}) AS INTEGER)"}
  when :|
    sql << complex_expression_arg_pairs(args){|a, b| "(#{literal(a)} - #{complex_expression_sql(:&, [a, b])} + #{literal(b)})"}
  when :^
    sql << complex_expression_arg_pairs(args){|*x| "(#{complex_expression_sql(:|, x)} - #{complex_expression_sql(:&, x)})"}
  when :'B~'
    sql << BITCOMP_OPEN
    literal_append(sql, args.at(0))
    sql << BITCOMP_CLOSE
  when :<<
    sql << complex_expression_arg_pairs(args){|a, b| "(#{literal(a)} * power(2, #{literal b}))"}
  when :>>
    sql << complex_expression_arg_pairs(args){|a, b| "(#{literal(a)} / power(2, #{literal b}))"}
  when :%
    sql << complex_expression_arg_pairs(args){|a, b| "MOD(#{literal(a)}, #{literal(b)})"}
  when :ILIKE, :'NOT ILIKE'
    sql << ILIKE_0
    literal_append(sql, args.at(0))
    sql << ILIKE_1
    sql << (op == :ILIKE ? LIKE : NOT_LIKE)
    sql<< ILIKE_2
    literal_append(sql, args.at(1))
    sql << ILIKE_3
  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 268
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 299
def empty?
  db[:dual].where(@opts[:offset] ? exists : unordered.exists).get(1) == nil
end
emulated_function_sql_append(sql, f) click to toggle source

Oracle treats empty strings like NULL values, and doesn't support char_length, so make char_length use length with a nonempty string. Unfortunately, as Oracle treats the empty string as NULL, there is no way to get trim to return an empty string instead of nil if the string only contains spaces.

# File lib/sequel/adapters/shared/oracle.rb, line 281
def emulated_function_sql_append(sql, f)
  case f.f
  when :char_length
    literal_append(sql, Sequel::SQL::Function.new(:length, Sequel.join([f.args.first, 'x'])) - 1)
  else
    super
  end
end
except(dataset, 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 291
def except(dataset, opts={})
  opts = {:all=>opts} unless opts.is_a?(Hash)
  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 331
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 304
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 316
def select_sql
  if (limit = @opts[:limit]) && !@opts[:sql]
    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] || ''
    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 311
def sequence(s)
  clone(:sequence=>s)
end
supports_group_cube?() click to toggle source

Oracle supports GROUP BY CUBE

# File lib/sequel/adapters/shared/oracle.rb, line 336
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 341
def supports_group_rollup?
  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 346
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 351
def supports_is_true?
  false
end
supports_select_all_and_column?() click to toggle source

Oracle does not support SELECT *, column

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

Oracle supports timezones in literal timestamps.

# File lib/sequel/adapters/shared/oracle.rb, line 361
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 366
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 371
def supports_window_functions?
  true
end