使用Sequel在JRuby中存储过程

时间:2014-10-09 22:14:34

标签: db2 jruby sequel

我试图在具有输出参数的DB2数据库中调用存储过程并返回游标。我可以通过JRuby使用JDBC完成这项工作,但我希望扩展Sequel以实现它,因为它具有更好的界面。我已经走到了这一步:

Sequel::JDBC::Database.class_eval do

  def call_test
    sql = "{call ddd.mystoredproc(?)}"
    result = {}
    synchronize do |conn|
      cps = conn.prepare_call(sql)
      cps.register_out_parameter(1, Types::INTEGER)
      result[:success] = cps.execute
      result[:outparam_val] = cps.get_int(1)
      if result[:success]
        dataset.send(:process_result_set, cps.get_data_set) do |row|
          yield row
        end
      end
      # rescue block
    end
  end

end  

这让我得到了一个ResultSet,我必须以非常Java的方式使用它,但不是一个很好的Sequel :: Dataset对象。我知道这段代码没有意义 - 我只是用它来试验值,所以有一次我返回结果哈希并查看它包含的内容。如果我能得到一些有用的东西,我会清理它并使它更灵活。看起来log_yield方法只是记录sql并产生块,所以我不知道其他什么东西被转换为Sequel :: Dataset。像DB [:ddd__sometable]这样的东西会返回一个我可以遍历的数据集,但我无法弄清楚底层Java ResultSet如何以及在什么时候被改变,或者我自己如何做。

编辑:由于Sequel :: Database可以创建一个虚拟数据集,而Sequel :: JDBC :: Dataset有一个私有方法可以转换结果集并将其生成块,上面就是我现在拥有的。这是有效的,但我绝对肯定必须有更好的方法。

Sequel似乎是Ruby最好的数据库库,这就是我尝试使用它的原因,但是如果有比使用直接JDBC更好的选择,我想知道它们也是。

1 个答案:

答案 0 :(得分:0)

Sequel目前不支持JDBC存储过程中的OUT参数,所以你目前所做的可能是最好的。