diff --git a/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb b/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb index 33feb53a0..ea14937d4 100644 --- a/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +++ b/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb @@ -250,7 +250,14 @@ def empty_insert_statement_value # Writes LOB values from attributes for specified columns def write_lobs(table_name, klass, attributes, columns) #:nodoc: - id = quote(attributes[klass.primary_key]) + if klass.primary_key.kind_of?(Array) + id_conditions = klass.primary_key.map { |key| + "#{quote_table_name(table_name)}.#{quote_column_name(key)} = #{quote(attributes[key])}" + }.join(' AND ') + else + id_conditions = "#{quote_table_name(table_name)}.#{quote_column_name(klass.primary_key)} = #{quote(attributes[klass.primary_key])}" + end + columns.each do |col| value = attributes[col.name] # changed sequence of next two lines - should check if value is nil before converting to yaml @@ -263,7 +270,7 @@ def write_lobs(table_name, klass, attributes, columns) #:nodoc: uncached do unless lob_record = select_one(sql = <<~SQL.squish, "Writable Large Object") SELECT #{quote_column_name(col.name)} FROM #{quote_table_name(table_name)} - WHERE #{quote_column_name(klass.primary_key)} = #{id} FOR UPDATE + WHERE #{id_conditions} FOR UPDATE SQL raise ActiveRecord::RecordNotFound, "statement #{sql} returned no rows" end