ruby dbi で i5 のストアド
結局、ruby dbiではストアドが返すパラメータ値をそのまま受け取ることは出来ないようだ。
CLPで書いたストアドプロシージャに値を渡す場合は、次のような感じで行ける。
例えば、データエリアに値をセットするCLプログラム『MYLIB.MYCLP』を作る
PGM PARM(&DATA)
DCL VAR(&DATA) TYPE(*CHAR) LEN(10)
CHGDTAARA DTAARA(MYDTAARA) VALUE(&DATA)
ENDPGM
これを呼び出すストアドプロシージャを作る
STRSQLして、
>CREATE PROCEDURE MYLIB/MYPROC(IN DATA CHAR (10))
LANGUAGE CL NOT DETERMINISTIC NO SQL
EXTERNAL NAME MYLIB/MYCLP PARAMETER STYLE GENERAL
Ruby on Rails側は、
application.rb controllerあたりで、
require ‘dbi’
しておき、
conn = DBI.connect(’DBI:ODBC:MYDSN’,'MYACCOUNT’,'MYPASSWORD’)
data = ‘1234567890′
sth = conn.prepare("CALL MYLIB.MYPROC(?)")
sth.bind_param(1, data)
sth.execute
sth.finish
conn.disconnect if conn
これで行ける。ストアドは、RPGでも、その他の言語でも書ける。
さてしかし、ストアドから値を受け取るのは、perl dbiのようには行かない。ruby dbiで値を受け取るには、SELECTなど値を返すSQLの結果データセットの形にしなければならないらしい。
取り敢えずは、返したい値をデータベースに書き込むようなストアドを書き、それを走らせた後でそのデータベースから値を取り出すようにすれば、まあやりたいことは叶う。
もう少し賢いやり方もありそうだし、そもそもdbiにこだわらなくても出来るのかもしれないが、まずはdbiを使っても、かなり高度なプログラムが書けそうなめどは立ったかな、と。
伊勢原では、梨畑の白い花が咲き誇っている。
TrackBacks
TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/399
この投稿には、まだコメントが付いていません