我试图在具有输出参数的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更好的选择,我想知道它们也是。
答案 0 :(得分:0)
Sequel目前不支持JDBC存储过程中的OUT参数,所以你目前所做的可能是最好的。