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
quoted_identifier_append(sql, name)

Raise error if trying to quote identifier containing “

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
401 def quoted_identifier_append(sql, name)
402   name = name.to_s
403   raise Error, "Oracle cannot quote an identifier containing \"" if name.include?('"')
404   sql << '"' << name << '"'
405 end
recursive_cte_requires_column_aliases?()

Oracle requires recursive CTEs to have column aliases.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
455 def recursive_cte_requires_column_aliases?
456   true
457 end
requires_sql_standard_datetimes?()

Oracle requires SQL standard datetimes

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

The version of the database server

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
545 def server_version
546   db.server_version(@opts[:server])
547 end
supports_cte?(type=:select)
[show source]
    # File lib/sequel/adapters/shared/oracle.rb
459 def supports_cte?(type=:select)
460   type == :select
461 end
supports_derived_column_lists?()

Oracle does not support derived column lists

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
464 def supports_derived_column_lists?
465   false
466 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
470 def supports_fetch_next_rows?
471   server_version >= 12000000 && !(@opts[:lock] || @opts[:skip_locked])
472 end
supports_group_cube?()

Oracle supports GROUP BY CUBE

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
475 def supports_group_cube?
476   true
477 end
supports_group_rollup?()

Oracle supports GROUP BY ROLLUP

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
480 def supports_group_rollup?
481   true
482 end
supports_grouping_sets?()

Oracle supports GROUPING SETS

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
485 def supports_grouping_sets?
486   true
487 end
supports_intersect_except_all?()

Oracle does not support INTERSECT ALL or EXCEPT ALL

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
490 def supports_intersect_except_all?
491   false
492 end
supports_is_true?()

Oracle does not support IS TRUE.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
495 def supports_is_true?
496   false
497 end
supports_limits_in_correlated_subqueries?()

Oracle does not support limits in correlated subqueries.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
500 def supports_limits_in_correlated_subqueries?
501   false
502 end
supports_merge?()

Oracle supports MERGE

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
505 def supports_merge?
506   true
507 end
supports_nowait?()

Oracle supports NOWAIT.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
510 def supports_nowait?
511   true
512 end
supports_offsets_in_correlated_subqueries?()

Oracle does not support offsets in correlated subqueries.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
515 def supports_offsets_in_correlated_subqueries?
516   false
517 end
supports_regexp?()

Oracle 10+ supports pattern matching via regular expressions

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

Oracle does not support SELECT *, column

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
520 def supports_select_all_and_column?
521   false
522 end
supports_skip_locked?()

Oracle supports SKIP LOCKED.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
525 def supports_skip_locked?
526   true
527 end
supports_timestamp_timezones?()

Oracle supports timezones in literal timestamps.

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
530 def supports_timestamp_timezones?
531   true
532 end
supports_where_true?()

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

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
535 def supports_where_true?
536   false
537 end
supports_window_functions?()

Oracle supports window functions

[show source]
    # File lib/sequel/adapters/shared/oracle.rb
540 def supports_window_functions?
541   true
542 end