Methods
Public Instance
- complex_expression_sql_append
- constant_sql_append
- empty?
- except
- recursive_cte_requires_column_aliases?
- requires_sql_standard_datetimes?
- select_sql
- sequence
- server_version
- supports_cte?
- supports_derived_column_lists?
- supports_fetch_next_rows?
- supports_group_cube?
- supports_group_rollup?
- supports_grouping_sets?
- supports_intersect_except_all?
- supports_is_true?
- supports_limits_in_correlated_subqueries?
- supports_merge?
- supports_nowait?
- supports_offsets_in_correlated_subqueries?
- supports_regexp?
- supports_select_all_and_column?
- supports_skip_locked?
- supports_timestamp_timezones?
- supports_where_true?
- supports_window_functions?
Included modules
- 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
# 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
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.
# 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
Use a custom expression with EXISTS to determine whether a dataset is empty.
# 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
Oracle
uses MINUS instead of EXCEPT, and doesn’t support EXCEPT ALL
# 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
Oracle
requires recursive CTEs to have column aliases.
# File lib/sequel/adapters/shared/oracle.rb 448 def recursive_cte_requires_column_aliases? 449 true 450 end
Oracle
requires SQL standard datetimes
# File lib/sequel/adapters/shared/oracle.rb 401 def requires_sql_standard_datetimes? 402 true 403 end
Handle LIMIT by using a unlimited subselect filtered with ROWNUM, unless Oracle
12 is used.
# 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
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.
# File lib/sequel/adapters/shared/oracle.rb 408 def sequence(s) 409 clone(:sequence=>s) 410 end
The version of the database server
# File lib/sequel/adapters/shared/oracle.rb 538 def server_version 539 db.server_version(@opts[:server]) 540 end
# File lib/sequel/adapters/shared/oracle.rb 452 def supports_cte?(type=:select) 453 type == :select 454 end
Oracle
does not support derived column lists
# File lib/sequel/adapters/shared/oracle.rb 457 def supports_derived_column_lists? 458 false 459 end
Oracle
supports FETCH NEXT ROWS since 12c, but it doesn’t work when locking or when skipping locked rows.
# File lib/sequel/adapters/shared/oracle.rb 463 def supports_fetch_next_rows? 464 server_version >= 12000000 && !(@opts[:lock] || @opts[:skip_locked]) 465 end
Oracle
supports GROUP BY CUBE
# File lib/sequel/adapters/shared/oracle.rb 468 def supports_group_cube? 469 true 470 end
Oracle
supports GROUP BY ROLLUP
# File lib/sequel/adapters/shared/oracle.rb 473 def supports_group_rollup? 474 true 475 end
Oracle
supports GROUPING SETS
# File lib/sequel/adapters/shared/oracle.rb 478 def supports_grouping_sets? 479 true 480 end
Oracle
does not support INTERSECT ALL or EXCEPT ALL
# File lib/sequel/adapters/shared/oracle.rb 483 def supports_intersect_except_all? 484 false 485 end
Oracle
does not support IS TRUE.
# File lib/sequel/adapters/shared/oracle.rb 488 def supports_is_true? 489 false 490 end
Oracle
supports MERGE
# File lib/sequel/adapters/shared/oracle.rb 498 def supports_merge? 499 true 500 end
Oracle
supports NOWAIT.
# File lib/sequel/adapters/shared/oracle.rb 503 def supports_nowait? 504 true 505 end
Oracle
10+ supports pattern matching via regular expressions
# File lib/sequel/adapters/shared/oracle.rb 543 def supports_regexp? 544 server_version >= 10010002 545 end
Oracle
does not support SELECT *, column
# File lib/sequel/adapters/shared/oracle.rb 513 def supports_select_all_and_column? 514 false 515 end
Oracle
supports SKIP LOCKED.
# File lib/sequel/adapters/shared/oracle.rb 518 def supports_skip_locked? 519 true 520 end
Oracle
supports timezones in literal timestamps.
# File lib/sequel/adapters/shared/oracle.rb 523 def supports_timestamp_timezones? 524 true 525 end
Oracle
does not support WHERE ‘Y’ for WHERE TRUE.
# File lib/sequel/adapters/shared/oracle.rb 528 def supports_where_true? 529 false 530 end
Oracle
supports window functions
# File lib/sequel/adapters/shared/oracle.rb 533 def supports_window_functions? 534 true 535 end