Module: Sequel::Oracle::DatasetMethods

Included in:
JDBC::Oracle::Dataset, Dataset
Defined in:
lib/sequel/adapters/shared/oracle.rb

Constant Summary collapse

ROW_NUMBER_EXPRESSION =
LiteralString.new('ROWNUM').freeze
SPACE =
Dataset::SPACE
APOS =
Dataset::APOS
APOS_RE =
Dataset::APOS_RE
DOUBLE_APOS =
Dataset::DOUBLE_APOS
FROM =
Dataset::FROM
TIMESTAMP_FORMAT =
"TIMESTAMP '%Y-%m-%d %H:%M:%S%N %z'".freeze
TIMESTAMP_OFFSET_FORMAT =
"%+03i:%02i".freeze
BOOL_FALSE =
"'N'".freeze
BOOL_TRUE =
"'Y'".freeze
HSTAR =
"H*".freeze
DUAL =
' FROM DUAL'.freeze
BITAND_PROC =
lambda{|a, b| Sequel.lit(["CAST(BITAND(", ", ", ") AS INTEGER)"], a, b)}

Instance Method Summary collapse

Instance Method Details

#complex_expression_sql_append(sql, op, args) ⇒ Object



273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
# File 'lib/sequel/adapters/shared/oracle.rb', line 273

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 :%, :<<, :>>, :'B~'
    complex_expression_emulate_append(sql, op, args)
  else
    super
  end
end

#constant_sql_append(sql, c) ⇒ Object

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.



295
296
297
298
299
300
301
# File 'lib/sequel/adapters/shared/oracle.rb', line 295

def constant_sql_append(sql, c)
  if c == :CURRENT_TIME
    super(sql, :CURRENT_TIMESTAMP)
  else
    super
  end
end

#empty? ⇒ Boolean

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

Returns:

  • (Boolean)


311
312
313
# File 'lib/sequel/adapters/shared/oracle.rb', line 311

def empty?
  db[:dual].where(@opts[:offset] ? exists : unordered.exists).get(1) == nil
end

#except(dataset, opts = OPTS) ⇒ Object

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

Raises:



304
305
306
307
# File 'lib/sequel/adapters/shared/oracle.rb', line 304

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? ⇒ Boolean

Oracle requires recursive CTEs to have column aliases.

Returns:

  • (Boolean)


359
360
361
# File 'lib/sequel/adapters/shared/oracle.rb', line 359

def recursive_cte_requires_column_aliases?
  true
end

#requires_sql_standard_datetimes? ⇒ Boolean

Oracle requires SQL standard datetimes

Returns:

  • (Boolean)


316
317
318
# File 'lib/sequel/adapters/shared/oracle.rb', line 316

def requires_sql_standard_datetimes?
  true
end

#select_sql ⇒ Object

Handle LIMIT by using a unlimited subselect filtered with ROWNUM.



328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
# File 'lib/sequel/adapters/shared/oracle.rb', line 328

def select_sql
  return super if @opts[:sql]
  if o = @opts[:offset]
    columns = clone(:append_sql=>'', :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] || ''
    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] || ''
    subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit)))
    sql
  else
    super
  end
end

#sequence(s) ⇒ Object

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.



323
324
325
# File 'lib/sequel/adapters/shared/oracle.rb', line 323

def sequence(s)
  clone(:sequence=>s)
end

#supports_cte?(type = :select) ⇒ Boolean

Returns:

  • (Boolean)


363
364
365
# File 'lib/sequel/adapters/shared/oracle.rb', line 363

def supports_cte?(type=:select)
  type == :select
end

#supports_derived_column_lists? ⇒ Boolean

Oracle does not support derived column lists

Returns:

  • (Boolean)


368
369
370
# File 'lib/sequel/adapters/shared/oracle.rb', line 368

def supports_derived_column_lists?
  false
end

#supports_group_cube? ⇒ Boolean

Oracle supports GROUP BY CUBE

Returns:

  • (Boolean)


373
374
375
# File 'lib/sequel/adapters/shared/oracle.rb', line 373

def supports_group_cube?
  true
end

#supports_group_rollup? ⇒ Boolean

Oracle supports GROUP BY ROLLUP

Returns:

  • (Boolean)


378
379
380
# File 'lib/sequel/adapters/shared/oracle.rb', line 378

def supports_group_rollup?
  true
end

#supports_intersect_except_all? ⇒ Boolean

Oracle does not support INTERSECT ALL or EXCEPT ALL

Returns:

  • (Boolean)


383
384
385
# File 'lib/sequel/adapters/shared/oracle.rb', line 383

def supports_intersect_except_all?
  false
end

#supports_is_true? ⇒ Boolean

Oracle does not support IS TRUE.

Returns:

  • (Boolean)


388
389
390
# File 'lib/sequel/adapters/shared/oracle.rb', line 388

def supports_is_true?
  false
end

#supports_limits_in_correlated_subqueries? ⇒ Boolean

Oracle does not support limits in correlated subqueries.

Returns:

  • (Boolean)


393
394
395
# File 'lib/sequel/adapters/shared/oracle.rb', line 393

def supports_limits_in_correlated_subqueries?
  false
end

#supports_offsets_in_correlated_subqueries? ⇒ Boolean

Oracle does not support offsets in correlated subqueries.

Returns:

  • (Boolean)


398
399
400
# File 'lib/sequel/adapters/shared/oracle.rb', line 398

def supports_offsets_in_correlated_subqueries?
  false
end

#supports_select_all_and_column? ⇒ Boolean

Oracle does not support SELECT *, column

Returns:

  • (Boolean)


403
404
405
# File 'lib/sequel/adapters/shared/oracle.rb', line 403

def supports_select_all_and_column?
  false
end

#supports_timestamp_timezones? ⇒ Boolean

Oracle supports timezones in literal timestamps.

Returns:

  • (Boolean)


408
409
410
# File 'lib/sequel/adapters/shared/oracle.rb', line 408

def supports_timestamp_timezones?
  true
end

#supports_where_true? ⇒ Boolean

Oracle does not support WHERE 'Y' for WHERE TRUE.

Returns:

  • (Boolean)


413
414
415
# File 'lib/sequel/adapters/shared/oracle.rb', line 413

def supports_where_true?
  false
end

#supports_window_functions? ⇒ Boolean

Oracle supports window functions

Returns:

  • (Boolean)


418
419
420
# File 'lib/sequel/adapters/shared/oracle.rb', line 418

def supports_window_functions?
  true
end