Module | Sequel::Oracle |
In: |
lib/sequel/adapters/oracle.rb
lib/sequel/adapters/shared/oracle.rb |
# 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
# File lib/sequel/adapters/shared/oracle.rb, line 324 324: def complex_expression_sql_append(sql, op, args) 325: case op 326: when :& 327: complex_expression_arg_pairs_append(sql, args, &BITAND_PROC) 328: when :| 329: complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)} 330: when :^ 331: complex_expression_arg_pairs_append(sql, args) do |*x| 332: s1 = complex_expression_arg_pairs(x){|a, b| Sequel.lit(["(", " - ", " + ", ")"], a, complex_expression_arg_pairs([a, b], &BITAND_PROC), b)} 333: s2 = complex_expression_arg_pairs(x, &BITAND_PROC) 334: Sequel.lit(["(", " - ", ")"], s1, s2) 335: end 336: when :~, '!~''!~', '~*''~*', '!~*''!~*' 337: raise InvalidOperation, "Pattern matching via regular expressions is not supported in this Oracle version" unless supports_regexp? 338: if op == '!~''!~' || op == '!~*''!~*' 339: sql << 'NOT ' 340: end 341: sql << 'REGEXP_LIKE(' 342: literal_append(sql, args[0]) 343: sql << ',' 344: literal_append(sql, args[1]) 345: if op == '~*''~*' || op == '!~*''!~*' 346: sql << ", 'i'" 347: end 348: sql << ')' 349: when :%, :<<, :>>, 'B~''B~' 350: complex_expression_emulate_append(sql, op, args) 351: else 352: super 353: end 354: 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, line 359 359: def constant_sql_append(sql, c) 360: if c == :CURRENT_TIME 361: super(sql, :CURRENT_TIMESTAMP) 362: else 363: super 364: end 365: end
Use a custom expression with EXISTS to determine whether a dataset is empty.
# File lib/sequel/adapters/shared/oracle.rb, line 375 375: def empty? 376: db[:dual].where(@opts[:offset] ? exists : unordered.exists).get(1) == nil 377: end
# File lib/sequel/adapters/shared/oracle.rb, line 426 426: def select_limit_sql(sql) 427: return unless supports_fetch_next_rows? 428: 429: if offset = @opts[:offset] 430: sql << " OFFSET " 431: literal_append(sql, offset) 432: sql << " ROWS" 433: end 434: 435: if limit = @opts[:limit] 436: sql << " FETCH NEXT " 437: literal_append(sql, limit) 438: sql << " ROWS ONLY" 439: end 440: end
Handle LIMIT by using a unlimited subselect filtered with ROWNUM, unless Oracle 12 is used.
# File lib/sequel/adapters/shared/oracle.rb, line 393 393: def select_sql 394: return super if @opts[:sql] 395: return super if supports_fetch_next_rows? 396: 397: o = @opts[:offset] 398: if o && o != 0 399: columns = clone(:append_sql=>String.new, :placeholder_literal_null=>true).columns 400: dsa1 = dataset_alias(1) 401: rn = row_number_column 402: limit = @opts[:limit] 403: ds = unlimited. 404: from_self(:alias=>dsa1). 405: select_append(ROW_NUMBER_EXPRESSION.as(rn)). 406: from_self(:alias=>dsa1). 407: select(*columns). 408: where(SQL::Identifier.new(rn) > o) 409: ds = ds.where(SQL::Identifier.new(rn) <= Sequel.+(o, limit)) if limit 410: sql = @opts[:append_sql] || String.new 411: subselect_sql_append(sql, ds) 412: sql 413: elsif limit = @opts[:limit] 414: ds = unlimited 415: # Lock doesn't work in subselects, so don't use a subselect when locking. 416: # Don't use a subselect if custom SQL is used, as it breaks somethings. 417: ds = ds.from_self unless @opts[:lock] 418: sql = @opts[:append_sql] || String.new 419: subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit))) 420: sql 421: else 422: super 423: end 424: end
The version of the database server
# File lib/sequel/adapters/shared/oracle.rb, line 523 523: def server_version 524: db.server_version(@opts[:server]) 525: end
# File lib/sequel/adapters/shared/oracle.rb, line 447 447: def supports_cte?(type=:select) 448: type == :select 449: end