class OCI8::Cursor

def make_bind_object(param, fetch_array_size = nil)

def make_bind_object(param, fetch_array_size = nil)
  case param
  when Hash
    key = param[:type]
    val = param[:value]
    max_array_size = param[:max_array_size]
    if key.nil?
      if val.nil?
        raise "bind type is not given."
      elsif val.is_a? OCI8::Object::Base
        key = :named_type
        param = @con.get_tdo_by_class(val.class)
      else
        key = val.class
      end
    elsif key.class == Class && key < OCI8::Object::Base
      param = @con.get_tdo_by_class(key)
      key = :named_type
    elsif key == :named_type
      param = @con.get_tdo_by_typename(param[:length])
    end
  when OCI8::Metadata::Base
    key = param.data_type
    case key
    when :named_type
      if param.type_name == 'XMLTYPE'
        key = :xmltype
      else
        param = @con.get_tdo_by_metadata(param.type_metadata)
      end
    end
  else
    raise "unknown param #{param.intern}"
  end
  bindclass = OCI8::BindType::Mapping[key]
  if bindclass.nil? and key.is_a? Class
    bindclass = OCI8::BindType::Mapping[key.to_s]
    OCI8::BindType::Mapping[key] = bindclass if bindclass
  end
  raise "unsupported datatype: #{key}" if bindclass.nil?
  bindclass.create(@con, val, param, fetch_array_size || max_array_size)
end