ストアド プロシージャからデータを取得するのに多くの時間を費やしています。コードは次のとおりです。
CREATE PROCEDURE aprocedure(
IN idin CHAR,
OUT returnvalue CHAR)
AS:
SET returnvalue=
(SELECT something
FROM sometable
WHERE id=idin)
問題なく作成できましたが、次のように呼び出そうとすると、次のようになります。
call someprocedure('theid', ?)
エラー -313 が何度も出てきました。宿題をして Web をチェックしましたが、IBM フォーラムはまったく役に立ちませんでした。ドキュメント、仕様、またはこれをより明確にするものは何も見つかりませんでした。また、SQL エラー コード -313 は、数字がプロシージャ内のパラメータの数が、呼び出し時に使用しているパラメータの数と一致しません。そのため、あまりにも多くの調査を行った結果、JDBC ドライバーを搭載した DB2 や SQuirreL は OUT 値を返すときに問題があると考えるようになりました (DB2 CTL クライアントもインストールし、ローカル データベースを作成し、テーブルを作成し、プロシージャを作成し、すべてがうまく機能したので、コードを次のように変更します (OUT の代わりに結果セットを使用するため)。
CREATE PROCEDURE someprocedure(IN idin CHAR (22))
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE cursor1 CURSOR WITH RETURN FOR
SELECT something FROM sometable WHERE id=idin;
OPEN cursor1;
END P1
aaaaaaaaaaaand NOTHING, SQuirreL は、それを作成しようとしたときにいくつかのエラー コードを表示したので、その同じコードを Aqua Data Studio 4.7 に入力し、魅力的に機能しました。次のように Aqua Data からプロシージャを呼び出します。
call someprocedure('theid');
そして、それは返されるはずだったものを返しました.SQuirreLで同じ文を試しました...そしてそれもうまくいきました!!
OUTタイプのリターンであっても、私のsintaxysはずっと正しかったと確信しているので、私の質問は、最終的にこれです。
SQuirreL は入力を JDBC に渡す前にチェックしますか? また、DB2 が SQL コードをどのように正確に変更しているかはどこで確認できますか?? すべてのDBMがSQLを少し変更することは誰もが知っているためですが、MySQLには優れたドキュメントがあります...正直なところ、DB2で適切なものを見つけることができませんでした。DB2ではCでストアドプロシージャを入力できるため、「純粋な」SQLについても話しています。 、Javaなど...