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)}
- SKIP_LOCKED =
" SKIP LOCKED".freeze
Instance Method Summary collapse
- #complex_expression_sql_append(sql, op, args) ⇒ Object
-
#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.
-
#empty? ⇒ Boolean
Use a custom expression with EXISTS to determine whether a dataset is empty.
-
#except(dataset, opts = OPTS) ⇒ Object
Oracle uses MINUS instead of EXCEPT, and doesn’t support EXCEPT ALL.
-
#recursive_cte_requires_column_aliases? ⇒ Boolean
Oracle requires recursive CTEs to have column aliases.
-
#requires_sql_standard_datetimes? ⇒ Boolean
Oracle requires SQL standard datetimes.
-
#select_sql ⇒ Object
Handle LIMIT by using a unlimited subselect filtered with ROWNUM.
-
#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.
- #supports_cte?(type = :select) ⇒ Boolean
-
#supports_derived_column_lists? ⇒ Boolean
Oracle does not support derived column lists.
-
#supports_group_cube? ⇒ Boolean
Oracle supports GROUP BY CUBE.
-
#supports_group_rollup? ⇒ Boolean
Oracle supports GROUP BY ROLLUP.
-
#supports_grouping_sets? ⇒ Boolean
Oracle supports GROUPING SETS.
-
#supports_intersect_except_all? ⇒ Boolean
Oracle does not support INTERSECT ALL or EXCEPT ALL.
-
#supports_is_true? ⇒ Boolean
Oracle does not support IS TRUE.
-
#supports_limits_in_correlated_subqueries? ⇒ Boolean
Oracle does not support limits in correlated subqueries.
-
#supports_offsets_in_correlated_subqueries? ⇒ Boolean
Oracle does not support offsets in correlated subqueries.
-
#supports_select_all_and_column? ⇒ Boolean
Oracle does not support SELECT *, column.
-
#supports_skip_locked? ⇒ Boolean
Oracle supports SKIP LOCKED.
-
#supports_timestamp_timezones? ⇒ Boolean
Oracle supports timezones in literal timestamps.
-
#supports_where_true? ⇒ Boolean
Oracle does not support WHERE ‘Y’ for WHERE TRUE.
-
#supports_window_functions? ⇒ Boolean
Oracle supports window functions.
Instance Method Details
#complex_expression_sql_append(sql, op, args) ⇒ Object
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 296 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.
318 319 320 321 322 323 324 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 318 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.
334 335 336 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 334 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
327 328 329 330 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 327 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.
382 383 384 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 382 def recursive_cte_requires_column_aliases? true end |
#requires_sql_standard_datetimes? ⇒ Boolean
Oracle requires SQL standard datetimes
339 340 341 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 339 def requires_sql_standard_datetimes? true end |
#select_sql ⇒ Object
Handle LIMIT by using a unlimited subselect filtered with ROWNUM.
351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 351 def select_sql return super if @opts[:sql] if o = @opts[:offset] columns = clone(:append_sql=>String.new, :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] || String.new 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] || String.new 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.
346 347 348 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 346 def sequence(s) clone(:sequence=>s) end |
#supports_cte?(type = :select) ⇒ Boolean
386 387 388 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 386 def supports_cte?(type=:select) type == :select end |
#supports_derived_column_lists? ⇒ Boolean
Oracle does not support derived column lists
391 392 393 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 391 def supports_derived_column_lists? false end |
#supports_group_cube? ⇒ Boolean
Oracle supports GROUP BY CUBE
396 397 398 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 396 def supports_group_cube? true end |
#supports_group_rollup? ⇒ Boolean
Oracle supports GROUP BY ROLLUP
401 402 403 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 401 def supports_group_rollup? true end |
#supports_grouping_sets? ⇒ Boolean
Oracle supports GROUPING SETS
406 407 408 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 406 def supports_grouping_sets? true end |
#supports_intersect_except_all? ⇒ Boolean
Oracle does not support INTERSECT ALL or EXCEPT ALL
411 412 413 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 411 def supports_intersect_except_all? false end |
#supports_is_true? ⇒ Boolean
Oracle does not support IS TRUE.
416 417 418 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 416 def supports_is_true? false end |
#supports_limits_in_correlated_subqueries? ⇒ Boolean
Oracle does not support limits in correlated subqueries.
421 422 423 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 421 def false end |
#supports_offsets_in_correlated_subqueries? ⇒ Boolean
Oracle does not support offsets in correlated subqueries.
426 427 428 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 426 def false end |
#supports_select_all_and_column? ⇒ Boolean
Oracle does not support SELECT *, column
431 432 433 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 431 def supports_select_all_and_column? false end |
#supports_skip_locked? ⇒ Boolean
Oracle supports SKIP LOCKED.
436 437 438 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 436 def supports_skip_locked? true end |
#supports_timestamp_timezones? ⇒ Boolean
Oracle supports timezones in literal timestamps.
441 442 443 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 441 def true end |
#supports_where_true? ⇒ Boolean
Oracle does not support WHERE ‘Y’ for WHERE TRUE.
446 447 448 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 446 def supports_where_true? false end |
#supports_window_functions? ⇒ Boolean
Oracle supports window functions
451 452 453 |
# File 'lib/sequel/adapters/shared/oracle.rb', line 451 def supports_window_functions? true end |