ライブラリ LMTLIB 内に AS400 RPGLE プログラムが作成されており、これは ARTEST と呼ばれます。
2 を返すだけの 1 つの数値 inout パラメータがあります。
$myVar = "1";
$db = Zend_Registry::get('config')->resources->multidb->as400;
$abstractAdapter = new Zend_Db_Adapter_Db2($db);
//Gives the message "Invalid bind-variable position 'myVar'"
$sql = 'CALL QSYS.QCMDEXC(\'CALL LMTLIB.ARTEST PARM(?)\', 0000000026.00000)';
//Gives the message "Token PARM was not valid. Valid tokens: ( INTO USING. SQLCODE=-104"
$sql = 'CALL LMTLIB.ARTEST PARM(?)';
//Gives the message "ARTEST in LMTLIB type *N not found. SQLCODE=-204"
$sql = 'CALL LMTLIB.ARTEST (?)';
$stmt = new Zend_Db_Statement_Db2($abstractAdapter, $sql);
$stmt->bindParam('myVar', $myVar, 4, 1);
$stmt->execute();
これで、3 番目の SQL ステートメントが「見つかりません」というメッセージで失敗する理由がなんとなく理解できます。これは、テーブル/ファイルではなく、RPGLE プログラムであるためです。
イライラするのは、(?) を削除して単純に (1) を挿入すると、SQL 呼び出しが成功したように見え、RPGLE プログラムはそれが呼び出されたことを示します。ただし、プログラムからの応答が何であったかを確認することはできません。
助けてくれてありがとう!