module ActiveRecord::Jdbc::PLSql

Constants

SQL_TYPES
VERSION

Public Instance Methods

call_procedure(name, *binds) click to toggle source

Entry point to call procedure

# File lib/activerecord/jdbc/plsql.rb, line 114
def call_procedure(name, *binds)
  parameters = parse_parameters(binds)

  request_string = create_request_string(name, parameters)
  statement = raw_connection.with_connection_retry_guard do |jdbc_connection|
    jdbc_connection.prepareCall(request_string)
  end

  output_parameters = parse_output_parameters(parameters)
  input_parameters = parse_input_parameters(parameters)

  register_parameters(statement, output_parameters, input_parameters)

  logger.info 'Call procedure: ' + request_string
  statement.execute

  get_results(statement, output_parameters)
end
create_request_string(name, attributes) click to toggle source
# File lib/activerecord/jdbc/plsql.rb, line 49
def create_request_string(name, attributes)
  "{CALL #{name}(#{Array.new(attributes.size, '?').join(', ')})}"
end
get_result(statement, key, type) click to toggle source

Choose the method to call with type

# File lib/activerecord/jdbc/plsql.rb, line 84
def get_result(statement, key, type)
  case type
    when :binary
      statement.getString(key)
    when :boolean
      statement.getBoolean(key)
    when :date
      statement.getDate(key)
    when :datetime
      statement.getTimestamp(key)
    when :decimal
      statement.getDouble(key)
    when :float
      statement.getFloat(key)
    when :integer
      statement.getInt(key)
    when :string
      statement.getString(key)
    when :text
      statement.getString(key)
    when :time
      statement.getTime(key)
    when :timestamp
      statement.getTimestamp(key)
    else
      statement.getObject(key)
  end
end
get_results(statement, output_parameters) click to toggle source

Store results in hash

# File lib/activerecord/jdbc/plsql.rb, line 74
def get_results(statement, output_parameters)
  results = Hash.new
  output_parameters.each do |k, v|
    key = k.is_a?(Symbol) ? k.to_s : k
    results[k] = get_result(statement, key, v)
  end
  results
end
parse_input_parameters(parameters) click to toggle source
# File lib/activerecord/jdbc/plsql.rb, line 29
def parse_input_parameters(parameters)
  input_parameters = Hash.new
  if parameters.is_a? Hash
    parameters.each { |k, v| input_parameters[k] = v unless SQL_TYPES.include? v}
  else
    parameters.each_with_index { |v, i| input_parameters[i + 1] = v unless SQL_TYPES.include? v }
  end
  input_parameters
end
parse_output_parameters(parameters) click to toggle source
# File lib/activerecord/jdbc/plsql.rb, line 39
def parse_output_parameters(parameters)
  output_parameters = Hash.new
  if parameters.is_a? Hash
    parameters.each { |k, v| output_parameters[k] = v if SQL_TYPES.include? v}
  else
    parameters.each_with_index { |v, i| output_parameters[i + 1] = v if SQL_TYPES.include? v }
  end
  output_parameters
end
parse_parameters(parameters) click to toggle source
# File lib/activerecord/jdbc/plsql.rb, line 21
def parse_parameters(parameters)
  if parameters.size == 1 and parameters[0].is_a? Hash
    parameters[0]
  else
    parameters
  end
end
register_input_parameters(statement, input_parameters) click to toggle source
# File lib/activerecord/jdbc/plsql.rb, line 53
def register_input_parameters(statement, input_parameters)
  input_parameters.each do |k, v|
    key = k.is_a?(Symbol) ? k.to_s : k
    statement.setObject(key, v)
  end
end
register_output_parameters(statement, output_parameters) click to toggle source
# File lib/activerecord/jdbc/plsql.rb, line 60
def register_output_parameters(statement, output_parameters)
  output_parameters.each do |k, v|
    key = k.is_a?(Symbol) ? k.to_s : k
    statement.registerOutParameter(key, SQL_TYPES[v])
  end
end
register_parameters(statement, output_parameters, input_parameters) click to toggle source
# File lib/activerecord/jdbc/plsql.rb, line 67
def register_parameters(statement, output_parameters, input_parameters)
  # Order is important for INOUT parameters
  register_output_parameters(statement, output_parameters)
  register_input_parameters(statement, input_parameters)
end