1

ライブラリ 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 プログラムはそれが呼び出されたことを示します。ただし、プログラムからの応答が何であったかを確認することはできません。

助けてくれてありがとう!

4

2 に答える 2

2

通常、データベース マネージャーは CALL ステートメントを使用してストアド プロシージャを呼び出します。その際、パラメーターの署名が CALL の署名と一致するストアド プロシージャを探します。

その名前と署名を持つストアド プロシージャがない場合、データベース マネージャーはプログラムを呼び出そうとします。ここでも、パラメータ マッチング プロセスが発生します。

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/db2/rbafzmstcallsta.htm

パラメータを適切に一致させることができるように、ストアド プロシージャを作成することをお勧めします。

于 2012-05-02T21:35:16.517 に答える