Module Sequel::Oracle
In: lib/sequel/adapters/shared/oracle.rb
lib/sequel/adapters/oracle.rb

Methods

Classes and Modules

Module Sequel::Oracle::DatabaseMethods
Module Sequel::Oracle::DatasetMethods
Class Sequel::Oracle::Database
Class Sequel::Oracle::Dataset

Public Class methods

[Source]

    # File lib/sequel/adapters/shared/oracle.rb, line 9
 9:     def self.mock_adapter_setup(db)
10:       db.instance_exec do
11:         @server_version = 11000000
12:         @primary_key_sequences = {}
13:       end
14:     end

Public Instance methods

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 325
325:       def complex_expression_sql_append(sql, op, args)
326:         case op
327:         when :&
328:           complex_expression_arg_pairs_append(sql, args, &BITAND_PROC)
329:         when :|
330:           complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)}
331:         when :^
332:           complex_expression_arg_pairs_append(sql, args) do |*x|
333:             s1 = complex_expression_arg_pairs(x){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)}
334:             s2 = complex_expression_arg_pairs(x, &BITAND_PROC)
335:             Sequel.lit(["(", " - ", ")"], s1, s2)
336:           end
337:         when :~, '!~''!~', '~*''~*', '!~*''!~*'
338:           raise InvalidOperation, "Pattern matching via regular expressions is not supported in this Oracle version" unless supports_regexp?
339:           if op == '!~''!~' || op == '!~*''!~*'
340:             sql << 'NOT '
341:           end
342:           sql << 'REGEXP_LIKE('
343:           literal_append(sql, args[0])
344:           sql << ','
345:           literal_append(sql, args[1])
346:           if op == '~*''~*' || op == '!~*''!~*'
347:             sql << ", 'i'"
348:           end
349:           sql << ')'
350:         when :%, :<<, :>>, 'B~''B~'
351:           complex_expression_emulate_append(sql, op, args)
352:         else
353:           super
354:         end
355:       end

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.

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 360
360:       def constant_sql_append(sql, c)
361:         if c == :CURRENT_TIME
362:           super(sql, :CURRENT_TIMESTAMP)
363:         else
364:           super
365:         end
366:       end

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

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 376
376:       def empty?
377:         db[:dual].where(@opts[:offset] ? exists : unordered.exists).get(1) == nil
378:       end

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

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 369
369:       def except(dataset, opts=OPTS)
370:         raise(Sequel::Error, "EXCEPT ALL not supported") if opts[:all]
371:         compound_clone(:minus, dataset, opts)
372:       end

Oracle requires recursive CTEs to have column aliases.

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 444
444:       def recursive_cte_requires_column_aliases?
445:         true
446:       end

Oracle requires SQL standard datetimes

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 381
381:       def requires_sql_standard_datetimes?
382:         true
383:       end

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 427
427:       def select_limit_sql(sql)
428:         return unless supports_fetch_next_rows?
429: 
430:         if offset = @opts[:offset]
431:           sql << " OFFSET "
432:           literal_append(sql, offset)
433:           sql << " ROWS"
434:         end
435: 
436:         if limit = @opts[:limit]
437:           sql << " FETCH NEXT "
438:           literal_append(sql, limit)
439:           sql << " ROWS ONLY"
440:         end
441:       end

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

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 394
394:       def select_sql
395:         return super if @opts[:sql]
396:         return super if supports_fetch_next_rows?
397: 
398:         o = @opts[:offset]
399:         if o && o != 0
400:           columns = clone(:append_sql=>String.new, :placeholder_literal_null=>true).columns
401:           dsa1 = dataset_alias(1)
402:           rn = row_number_column
403:           limit = @opts[:limit]
404:           ds = unlimited.
405:             from_self(:alias=>dsa1).
406:             select_append(ROW_NUMBER_EXPRESSION.as(rn)).
407:             from_self(:alias=>dsa1).
408:             select(*columns).
409:             where(SQL::Identifier.new(rn) > o)
410:           ds = ds.where(SQL::Identifier.new(rn) <= Sequel.+(o, limit)) if limit
411:           sql = @opts[:append_sql] || String.new
412:           subselect_sql_append(sql, ds)
413:           sql
414:         elsif limit = @opts[:limit]
415:           ds = unlimited
416:           # Lock doesn't work in subselects, so don't use a subselect when locking.
417:           # Don't use a subselect if custom SQL is used, as it breaks somethings.
418:           ds = ds.from_self unless @opts[:lock]
419:           sql = @opts[:append_sql] || String.new
420:           subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit)))
421:           sql
422:         else
423:           super
424:         end
425:       end

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.

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 388
388:       def sequence(s)
389:         clone(:sequence=>s)
390:       end

The version of the database server

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 529
529:       def server_version
530:         db.server_version(@opts[:server])
531:       end

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 448
448:       def supports_cte?(type=:select)
449:         type == :select
450:       end

Oracle does not support derived column lists

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 453
453:       def supports_derived_column_lists?
454:         false
455:       end

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

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 459
459:       def supports_fetch_next_rows?
460:         server_version >= 12000000 && !(@opts[:lock] || @opts[:skip_locked])
461:       end

Oracle supports GROUP BY CUBE

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 464
464:       def supports_group_cube?
465:         true
466:       end

Oracle supports GROUP BY ROLLUP

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 469
469:       def supports_group_rollup?
470:         true
471:       end

Oracle supports GROUPING SETS

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 474
474:       def supports_grouping_sets?
475:         true
476:       end

Oracle does not support INTERSECT ALL or EXCEPT ALL

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 479
479:       def supports_intersect_except_all?
480:         false
481:       end

Oracle does not support IS TRUE.

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 484
484:       def supports_is_true?
485:         false
486:       end

Oracle does not support limits in correlated subqueries.

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 489
489:       def supports_limits_in_correlated_subqueries?
490:         false
491:       end

Oracle supports NOWAIT.

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 494
494:       def supports_nowait?
495:         true
496:       end

Oracle does not support offsets in correlated subqueries.

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 499
499:       def supports_offsets_in_correlated_subqueries?
500:         false
501:       end

Oracle 10+ supports pattern matching via regular expressions

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 534
534:       def supports_regexp?
535:         server_version >= 10010002
536:       end

Oracle does not support SELECT *, column

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 504
504:       def supports_select_all_and_column?
505:         false
506:       end

Oracle supports SKIP LOCKED.

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 509
509:       def supports_skip_locked?
510:         true
511:       end

Oracle supports timezones in literal timestamps.

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 514
514:       def supports_timestamp_timezones?
515:         true
516:       end

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

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 519
519:       def supports_where_true?
520:         false
521:       end

Oracle supports window functions

[Source]

     # File lib/sequel/adapters/shared/oracle.rb, line 524
524:       def supports_window_functions?
525:         true
526:       end

[Validate]