Methods
Public Instance
- complex_expression_sql_append
- constant_sql_append
- empty?
- except
- quoted_identifier_append
- 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
Raise error if trying to quote identifier containing “
# 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
Oracle requires recursive CTEs to have column aliases.
# File lib/sequel/adapters/shared/oracle.rb 455 def recursive_cte_requires_column_aliases? 456 true 457 end
Oracle requires SQL standard datetimes
# File lib/sequel/adapters/shared/oracle.rb 408 def requires_sql_standard_datetimes? 409 true 410 end
Handle LIMIT by using a unlimited subselect filtered with ROWNUM, unless Oracle 12 is used.
# 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
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 415 def sequence(s) 416 clone(:sequence=>s) 417 end
The version of the database server
# File lib/sequel/adapters/shared/oracle.rb 545 def server_version 546 db.server_version(@opts[:server]) 547 end
# File lib/sequel/adapters/shared/oracle.rb 459 def supports_cte?(type=:select) 460 type == :select 461 end
Oracle does not support derived column lists
# File lib/sequel/adapters/shared/oracle.rb 464 def supports_derived_column_lists? 465 false 466 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 470 def supports_fetch_next_rows? 471 server_version >= 12000000 && !(@opts[:lock] || @opts[:skip_locked]) 472 end
Oracle supports GROUP BY CUBE
# File lib/sequel/adapters/shared/oracle.rb 475 def supports_group_cube? 476 true 477 end
Oracle supports GROUP BY ROLLUP
# File lib/sequel/adapters/shared/oracle.rb 480 def supports_group_rollup? 481 true 482 end
Oracle supports GROUPING SETS
# File lib/sequel/adapters/shared/oracle.rb 485 def supports_grouping_sets? 486 true 487 end
Oracle does not support INTERSECT ALL or EXCEPT ALL
# File lib/sequel/adapters/shared/oracle.rb 490 def supports_intersect_except_all? 491 false 492 end
Oracle does not support IS TRUE.
# File lib/sequel/adapters/shared/oracle.rb 495 def supports_is_true? 496 false 497 end
Oracle supports MERGE
# File lib/sequel/adapters/shared/oracle.rb 505 def supports_merge? 506 true 507 end
Oracle supports NOWAIT.
# File lib/sequel/adapters/shared/oracle.rb 510 def supports_nowait? 511 true 512 end
Oracle 10+ supports pattern matching via regular expressions
# File lib/sequel/adapters/shared/oracle.rb 550 def supports_regexp? 551 server_version >= 10010002 552 end
Oracle does not support SELECT *, column
# File lib/sequel/adapters/shared/oracle.rb 520 def supports_select_all_and_column? 521 false 522 end
Oracle supports SKIP LOCKED.
# File lib/sequel/adapters/shared/oracle.rb 525 def supports_skip_locked? 526 true 527 end
Oracle supports timezones in literal timestamps.
# File lib/sequel/adapters/shared/oracle.rb 530 def supports_timestamp_timezones? 531 true 532 end
Oracle does not support WHERE ‘Y’ for WHERE TRUE.
# File lib/sequel/adapters/shared/oracle.rb 535 def supports_where_true? 536 false 537 end
Oracle supports window functions
# File lib/sequel/adapters/shared/oracle.rb 540 def supports_window_functions? 541 true 542 end