1

ストアド プロシージャからデータを取得するのに多くの時間を費やしています。コードは次のとおりです。

            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など...

4

0 に答える 0