我正在尝试在具有输出参数并且还返回游标的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
但是,这给我带来了我必须以非常类似于Java的方式使用的ResultSet,但这并不是一个不错的Sequel :: Dataset对象。我知道这段代码没有意义-我只是用它来试验值,所以有一次我返回了结果哈希并查看其中包含的内容。如果我能得到一些有用的东西,我将对其进行清理并使其更加灵活。看起来log_yield方法只是记录sql并将yield记录到块中,所以我不知道其他任何东西如何转换为Sequel :: Dataset。进行类似DB [:ddd__sometable]的操作将返回我可以循环访问的数据集,但是我无法弄清楚底层Java ResultSet的转换方式和转换点,以及如何自行更改。
edit:由于Sequel :: Database可以创建一个虚拟数据集,并且Sequel :: JDBC :: Dataset具有将结果集转换为块的私有方法,因此上述就是我所拥有的现在。这可行,但是我绝对肯定必须有更好的方法。
[Sequel似乎是Ruby最好的数据库库,这就是我尝试使用它的原因,但是如果有比使用直接JDBC更好的替代方法,我也想了解它们。
Sequel当前在JDBC上的存储过程中不支持OUT参数,所以您目前正在做的可能是最好的。