# File lib/arel/engines/sql/compilers/oracle_compiler.rb, line 65
65: def delete_sql
66: where_clauses = relation.wheres.collect(&:to_sql)
67: taken = relation.taken
68: where_clauses << "ROWNUM <= #{taken}" unless taken.blank?
69: build_query "DELETE",
70: "FROM #{relation.table_sql}",
71: ("WHERE #{where_clauses.join(' AND ')}" unless where_clauses.blank? )
72: end
# File lib/arel/engines/sql/compilers/oracle_compiler.rb, line 5
5: def select_sql
6: select_clauses = relation.select_clauses
7: from_clauses = relation.from_clauses
8: joins = relation.joins(self)
9: where_clauses = relation.where_clauses
10: order_clauses = relation.order_clauses
11: group_clauses = relation.group_clauses
12: having_clauses = relation.having_clauses
13: taken = relation.taken
14: skipped = relation.skipped
15: if limit_or_offset = !taken.blank? || !skipped.blank?
16: # if need to select first records without ORDER BY and GROUP BY and without DISTINCT
17: # then can use simple ROWNUM in WHERE clause
18: if skipped.blank? && group_clauses.blank? && order_clauses.blank? && select_clauses[0] !~ /^DISTINCT /
19: where_clauses << "ROWNUM <= #{taken}" if !taken.blank? && skipped.blank? && group_clauses.blank? && order_clauses.blank?
20: limit_or_offset = false
21: end
22: end
23:
24: # when limit or offset subquery is used then cannot use FOR UPDATE directly
25: # and need to construct separate subquery for primary key
26: if use_subquery_for_lock = limit_or_offset && !locked.blank?
27: quoted_primary_key = engine.connection.quote_column_name(relation.primary_key)
28: end
29: select_attributes_string = use_subquery_for_lock ? quoted_primary_key : select_clauses.join(', ')
30:
31: # OracleEnhanced adapter workaround when ORDER BY is used with columns not
32: # present in DISTINCT columns list
33: order_clauses_array = if select_attributes_string =~ /DISTINCT.*FIRST_VALUE/ && !order_clauses.blank?
34: order = order_clauses.join(', ').split(',').map { |s| s.strip }.reject(&:blank?)
35: order = order.zip((0...order.size).to_a).map { |s,i| "alias_#{i}__ #{'DESC' if s =~ /\bdesc$/i}" }
36: else
37: order_clauses
38: end
39:
40: query = build_query "SELECT #{select_attributes_string}",
41: "FROM #{from_clauses}",
42: (joins unless joins.blank? ),
43: ("WHERE #{where_clauses.join(' AND ')}" unless where_clauses.blank? ),
44: ("GROUP BY #{group_clauses.join(', ')}" unless group_clauses.blank? ),
45: ("HAVING #{having_clauses.join(' AND ')}" unless having_clauses.blank? ),
46: ("ORDER BY #{order_clauses_array.join(', ')}" unless order_clauses_array.blank? )
47:
48: # Use existing method from oracle_enhanced adapter to implement limit and offset using subqueries
49: engine.connection.add_limit_offset!(query, :limit => taken, :offset => skipped) if limit_or_offset
50:
51: if use_subquery_for_lock
52: build_query "SELECT #{select_clauses.join(', ')}",
53: "FROM #{from_clauses}",
54: "WHERE #{quoted_primary_key} IN (#{query})",
55: "#{locked}"
56: elsif !locked.blank?
57: build_query query, "#{locked}"
58: else
59: query
60: end
61: end
# File lib/arel/engines/sql/compilers/oracle_compiler.rb, line 77
77: def build_update_conditions_sql
78: conditions = ""
79: where_clauses = relation.wheres.collect(&:to_sql)
80: taken = relation.taken
81: # if need to select first records without ORDER BY
82: # then can use simple ROWNUM in WHERE clause
83: if !taken.blank? && relation.orders.blank?
84: where_clauses << "ROWNUM <= #{taken}"
85: end
86: conditions << " WHERE #{where_clauses.join(' AND ')}" unless where_clauses.blank?
87: unless taken.blank?
88: conditions = limited_update_conditions(conditions, taken)
89: end
90: conditions
91: end
# File lib/arel/engines/sql/compilers/oracle_compiler.rb, line 93
93: def limited_update_conditions(conditions, taken)
94: order_clauses = relation.order_clauses
95: # need to add ORDER BY only if just taken ones should be updated
96: conditions << " ORDER BY #{order_clauses.join(', ')}" unless order_clauses.blank?
97: quoted_primary_key = engine.connection.quote_column_name(relation.primary_key)
98: subquery = "SELECT #{quoted_primary_key} FROM #{engine.connection.quote_table_name relation.table.name} #{conditions}"
99: # Use existing method from oracle_enhanced adapter to get taken records when ORDER BY is used
100: engine.connection.add_limit_offset!(subquery, :limit => taken) unless order_clauses.blank?
101: "WHERE #{quoted_primary_key} IN (#{subquery})"
102: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.