module Sequel::Oracle::DatasetMethods

  1. lib/sequel/adapters/shared/oracle.rb

Included modules

  1. AutoCastDateAndTime

Constants

BITAND_PROC = lambda{|a, b| Sequel.lit(["CAST(BITAND(", ", ", ") AS INTEGER)"], a, b)}  
ROW_NUMBER_EXPRESSION = LiteralString.new('ROWNUM').freeze  

Public Instance methods

complex_expression_sql_append(sql, op, args)
[show source]
    # File lib/sequel/adapters/shared/oracle.rb
340 def complex_expression_sql_append(sql, op, args)
341   case op
342   when :&
343     complex_expression_arg_pairs_append(sql, args, &BITAND_PROC)
344   when :|
345     complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)}
346   when :^
347     complex_expression_arg_pairs_append(sql, args) do |*x|
348       s1 = complex_expression_arg_pairs(x){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)}
349       s2 = complex_expression_arg_pairs(x, &BITAND_PROC)
350       Sequel.lit(["(", " - ", ")"], s1, s2)
351     end
352   when :~, :'!~', :'~*', :'!~*'
353     raise InvalidOperation, "Pattern matching via regular expressions is not supported in this Oracle version" unless supports_regexp?
354     if op == :'!~' || op == :'!~*'
355       sql << 'NOT '
356     end
357     sql << 'REGEXP_LIKE('
358     literal_append(sql, args[0])
359     sql << ','
360     literal_append(sql, args[1])
361     if op == :'~*' || op == :'!~*'
362       sql << ", 'i'"
363     end
364     sql << ')'
365   when :%, :<<, :>>, :'B~'
366     complex_expression_emulate_append(sql, op, args)
367   else
368     super
369   end
370 end
constant_sql_append(sql, c)

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.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
375 def constant_sql_append(sql, c)
376   if c == :CURRENT_TIME
377     super(sql, :CURRENT_TIMESTAMP)
378   else
379     super
380   end
381 end
empty?()

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

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
391 def empty?
392   if @opts[:sql]
393     naked.each{return false}
394     true
395   else
396     db[:dual].where(@opts[:offset] ? exists : unordered.exists).get(1) == nil
397   end
398 end
except(dataset, opts=OPTS)

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

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
384 def except(dataset, opts=OPTS)
385   raise(Sequel::Error, "EXCEPT ALL not supported") if opts[:all]
386   compound_clone(:minus, dataset, opts)
387 end
recursive_cte_requires_column_aliases?()

Oracle requires recursive CTEs to have column aliases.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
448 def recursive_cte_requires_column_aliases?
449   true
450 end
requires_sql_standard_datetimes?()

Oracle requires SQL standard datetimes

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
401 def requires_sql_standard_datetimes?
402   true
403 end
select_sql()

Handle LIMIT by using a unlimited subselect filtered with ROWNUM, unless Oracle 12 is used.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
414 def select_sql
415   return super if @opts[:sql]
416   return super if supports_fetch_next_rows?
417 
418   o = @opts[:offset]
419   if o && o != 0
420     columns = clone(:append_sql=>String.new, :placeholder_literal_null=>true).columns
421     dsa1 = dataset_alias(1)
422     rn = row_number_column
423     limit = @opts[:limit]
424     ds = unlimited.
425       from_self(:alias=>dsa1).
426       select_append(ROW_NUMBER_EXPRESSION.as(rn)).
427       from_self(:alias=>dsa1).
428       select(*columns).
429       where(SQL::Identifier.new(rn) > o)
430     ds = ds.where(SQL::Identifier.new(rn) <= Sequel.+(o, limit)) if limit
431     sql = @opts[:append_sql] || String.new
432     subselect_sql_append(sql, ds)
433     sql
434   elsif limit = @opts[:limit]
435     ds = unlimited
436     # Lock doesn't work in subselects, so don't use a subselect when locking.
437     # Don't use a subselect if custom SQL is used, as it breaks somethings.
438     ds = ds.from_self unless @opts[:lock]
439     sql = @opts[:append_sql] || String.new
440     subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit)))
441     sql
442   else
443     super
444   end
445 end
sequence(s)

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.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
408 def sequence(s)
409   clone(:sequence=>s)
410 end
server_version()

The version of the database server

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
538 def server_version
539   db.server_version(@opts[:server])
540 end
supports_cte?(type=:select)
[show source]
    # File lib/sequel/adapters/shared/oracle.rb
452 def supports_cte?(type=:select)
453   type == :select
454 end
supports_derived_column_lists?()

Oracle does not support derived column lists

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
457 def supports_derived_column_lists?
458   false
459 end
supports_fetch_next_rows?()

Oracle supports FETCH NEXT ROWS since 12c, but it doesn’t work when locking or when skipping locked rows.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
463 def supports_fetch_next_rows?
464   server_version >= 12000000 && !(@opts[:lock] || @opts[:skip_locked])
465 end
supports_group_cube?()

Oracle supports GROUP BY CUBE

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
468 def supports_group_cube?
469   true
470 end
supports_group_rollup?()

Oracle supports GROUP BY ROLLUP

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
473 def supports_group_rollup?
474   true
475 end
supports_grouping_sets?()

Oracle supports GROUPING SETS

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
478 def supports_grouping_sets?
479   true
480 end
supports_intersect_except_all?()

Oracle does not support INTERSECT ALL or EXCEPT ALL

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
483 def supports_intersect_except_all?
484   false
485 end
supports_is_true?()

Oracle does not support IS TRUE.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
488 def supports_is_true?
489   false
490 end
supports_limits_in_correlated_subqueries?()

Oracle does not support limits in correlated subqueries.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
493 def supports_limits_in_correlated_subqueries?
494   false
495 end
supports_merge?()

Oracle supports MERGE

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
498 def supports_merge?
499   true
500 end
supports_nowait?()

Oracle supports NOWAIT.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
503 def supports_nowait?
504   true
505 end
supports_offsets_in_correlated_subqueries?()

Oracle does not support offsets in correlated subqueries.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
508 def supports_offsets_in_correlated_subqueries?
509   false
510 end
supports_regexp?()

Oracle 10+ supports pattern matching via regular expressions

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
543 def supports_regexp?
544   server_version >= 10010002
545 end
supports_select_all_and_column?()

Oracle does not support SELECT *, column

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
513 def supports_select_all_and_column?
514   false
515 end
supports_skip_locked?()

Oracle supports SKIP LOCKED.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
518 def supports_skip_locked?
519   true
520 end
supports_timestamp_timezones?()

Oracle supports timezones in literal timestamps.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
523 def supports_timestamp_timezones?
524   true
525 end
supports_where_true?()

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

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
528 def supports_where_true?
529   false
530 end
supports_window_functions?()

Oracle supports window functions

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
533 def supports_window_functions?
534   true
535 end