`

ruby调用oracle存储过程实例之存储过程实例化

 
阅读更多
控制层请求:
@radius = Procedure::AuthUserStatQry.new.query_user_stat(params, sort, page)


模型层:
class Procedure::AuthUserStatQry < Procedure::Base
  #存储过程名称
  set_procedure_name "WLAN_AUTH_USER_STAT_QRY"
  #存储过程参数
  set_procedure_params [:netloc_gran, :startdate, :enddate,
    :time_gran, :hourlist, :top_n, :p_order,
    :p_curpage, :p_pagesize, :p_totalrecords, :p_totalpages, :cursor]
  
  def initialize(options={})
    super options
    set_param_values({:top_n => "", :p_order => "", :p_curpage => 0, :p_pagesize => 30, :p_totalrecords => 0, :p_totalpages => 0})
    self.cursor = DBI::StatementHandle
  end
  
  def query_user_stat(params, sort, page)
    set_param_values({
          :netloc_gran => 0,
          :startdate => params[:begin_time],
          :enddate => params[:end_time],
          :time_gran => params[:time_gran],
          :p_pagesize => page[:page_size]})
    attach_sort(sort)
    self.p_curpage = page[:page]
    self.execute
  end
end


存储过程Procedure::Base连接封装:

require 'rubygems'
require 'dbi'
module Procedure
end
class Procedure::Base
  include DbQuery
  attr_reader :results, :column_info, :total_count
  def initialize(options)    
    set_param_values options
    @attributes = {}
  end

  def query(options)
    set_param_values options
    execute
  end
  
  def attach_sort(sort)
    if(!sort.nil? && sort[:name])
      self.p_order = "order by \"#{sort[:name]}\" #{sort[:direction]}"
    end
  end

  def execute1
    records = []
    with_db_ora do |dbh|
      sth_db = dbh.prepare query_str
      bind_params sth_db, query_options
      sth_db.execute
      sth = sth_db.func(:bind_value, ":cursor")
      unless sth.nil?
        column_info = sth.column_info
        results = sth.fetch_all
        @total_count = sth_db.func(:bind_value, ":p_totalpages")
        results.each do |r|
          records << instantiate(column_info, r)
        end
      end
    end
    records
  end
  
  def execute
    with_db_ora do |dbh|
      sth_db = dbh.prepare query_str
      bind_params sth_db, query_options
      ActiveRecord::Base.logger.info("Procedure[#{query_str}]")
      ActiveRecord::Base.logger.info("Execute procedure[#{procedure_name}]:{#{query_options.join(",")}}")
      sth_db.execute
      sth = sth_db.func(:bind_value, ":cursor")
      unless sth.nil?
        @column_info = sth.column_info
        @results = fetch_result sth_db, sth
        @total_count = sth_db.func(:bind_value, ":p_totalrecords")
      else
        @results = fetch_result sth_db, sth
      end
    end
    self
  end

  def set_param_values(params)
    params.each{|k, v|
      self.send((k.to_s + "=").to_sym, v)
    }
  end

  def param_values
    values = []
    options = query_options
    self.params.each do |param|
      values << options[param]
    end
    values
  end

  def method_missing(m, *args, &block)
    @attributes[m.to_s]
  end

  def [](attr_name)
    @attributes[attr_name.to_s]
  end

  protected
  def instantiate(column, record)
    object = self.class.new
    attributes = {}
    column.each_index do |i|
      attributes[column[i].name.downcase] = record[i]
    end
    object.instance_variable_set("@attributes", attributes)
    object
  end

  def fetch_result(sth_db, sth)
    sth.fetch_all unless sth.nil?
  end
  
  def set_query_collection_params
    self.index_sys = 1
    self.time_gran = 7
    self.cursor = DBI::StatementHandle
  end

  def query_options
    options = {}
    self.params.each do |param|
      options[param] = self.send(param.to_sym)
    end
    options
  end
  
  def query_str
    param_str = ""
    self.params.each do |param|
      param_str = param_str + ":" + param.to_s + ","
    end
    "BEGIN #{procedure_name}(#{param_str[0, param_str.length - 1]});END;"
  end

  class << self
    def set_procedure_name(value)
      define_method(:procedure_name) { value }
    end
    
    def set_procedure_params(value)
      define_method(:params) { value }
      value.each{|param| attr_accessor param.to_sym }
    end
  end
end




需要添加DBI gem包
gem install dbi
DBI连接池创建模块include DbQuery相关代码:
require 'rubygems'
require 'dbi'

module DbQuery
  def bind_params(sth_db, options)
    return if(sth_db.nil? || options.nil?)
    options.each_key { |key| sth_db.bind_param(":#{key.to_s}", options[key]) }
  end
  
  def with_db_ora
    #$CFG为全局常量,指向databases.yml相关oracle配置参数
    userName = $CFG['username']
    password = $CFG['password']
    database = $CFG['database']
    database = "DBI:OCI8:#{database}"

    dbh = DBI.connect(database,userName,password)
    begin
      yield dbh
    ensure
      dbh.disconnect
    end
  end
end



最后一点小贴士:通过DBI可以直接创建多数据库的连接
DbStyleHashs = {"mysql"=>"DBI:Mysql","oracle"=>"DBI:OCI8"} #由dbi扩充支持其他库类
  #数据库参数获取
  def db_connects(style=nil,d=nil,u=nil,p=nil) 
       @userName = u
      @password = p
      database =  d
      @database = "#{DbStyleHashs[style]}:#{database}"
      @dbh = DBI.connect(@database,@userName,@password)
  end
分享到:
评论

相关推荐

    使用Ruby on Rails快速开发web应用的教程实例

    在学习和使用Ruby on Rails的过程中,需要熟悉Ruby语言的语法、面向对象编程以及MVC架构设计。随着Rails的更新和迭代,它引入了许多现代Web开发的新特性,比如RESTful路由、AJAX集成和安全机制等,这些都为开发者...

    java开源包1

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    cn-web人才网系统 v1.0 Beta_hr.zip

    可能使用的数据库管理系统有MySQL、PostgreSQL、Oracle或MongoDB等,用于存储和检索数据。 3. **前端技术**:前端界面的实现可能采用了HTML5、CSS3和JavaScript,配合现代化的前端框架如React、Vue.js或Angular,以...

    VirtualBoxSDK-5.0.2-102096开发包

    VirtualBox SDK 5.0.2-102096是Oracle公司为开发者提供的一套用于构建和扩展VirtualBox虚拟化平台的软件开发工具包。这个开发包允许程序员通过编程接口(API)来控制和定制VirtualBox的功能,实现虚拟机管理、自动化...

    jdk1.7-win32位

    2. **类型推断**: Java 7的编译器引入了"钻石操作符"(),简化了匿名内部类和泛型实例化时的类型声明,减少了代码冗余。 3. **自动资源管理**: 使用try-with-resources语句,可以确保在程序块结束时正确关闭文件、...

    javaSE代码实例

    6.1.2 面向过程与面向对象思想的对比 78 6.1.3 面向对象技术的背景和特点 79 6.2 类的定义与对象的创建 80 6.3 成员变量 81 6.3.1 成员变量的开发与使用 81 6.3.2 成员变量的初始值 82 6.3.3 对象引用...

    一个很好的动态网页制作案例05.rar

    它们存储和管理网页所需的数据,供服务器端语言调用。 5. **框架和库**: 为了简化开发,开发者通常会使用前端框架(如React、Vue.js、Angular)和后端框架(如Laravel、Express、Django)。这些框架提供了预定义...

    EhcacheUserGuide

    这部分内容分别介绍了如何使用远程方法调用(RMI)、JGroups消息传递系统和Java消息服务(JMS)来实现Ehcache的复制缓存。 #### 二十二、关闭Ehcache(Shutting Down Ehcache) 在应用程序结束运行时,正确地关闭...

    J2EE 资源集合

    CORBA(Common Object Request Broker Architecture)是面向对象分布式计算的一种标准,它允许不同系统之间的对象互相调用方法。这份文档将引导读者了解CORBA的基本概念、工作原理以及如何在J2EE环境中集成和使用...

    nashorn.jar

    其主要原因在于,Oracle希望推动开发者转向使用更现代化的JavaScript运行时,如GraalVM。GraalVM不仅支持JavaScript,还支持多种其他语言,如Python、Ruby等,而且在性能方面有显著提升。 总的来说,Nashorn.jar在...

    java开源包2

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包3

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包6

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包5

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包10

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包8

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包7

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包9

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包11

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

Global site tag (gtag.js) - Google Analytics