3

dblinkを介してストアドプロシージャを呼び出すための回答から、リモートDBリンクを介してSP呼び出しを行っている場合、ストアドプロシージャを呼び出してResultSet/RefCursorを取得することはできないようです。Oracle10gも使用しています。

リンク全体で単一値の結果を正常に取得でき、SPを正常に呼び出してローカルで結果を取得できますが、リモートDBからResultSetを読み取るときに、同じ「ORA-24338:ステートメントハンドルが実行されません」というエラーが発生します。

私の質問-ストアドプロシージャを使用するための回避策はありますか?共有ビューはより良い解決策ですか?パイプ行?

サンプルストアドプロシージャ:

CREATE OR REPLACE PACKAGE BODY example_SP
IS

  PROCEDURE get_terminals(p_CD_community   IN  community.CD_community%TYPE,
                          p_cursor         OUT SYS_REFCURSOR)
  IS
  BEGIN
    OPEN p_cursor FOR
    SELECT cd_terminal
    FROM terminal t, community c
    WHERE c.cd_community = p_CD_community
    AND t.id_community = c.id_community;
  END;

END example_SP;
/

ローカルでは機能するがリモートでは機能しないサンプルJavaコード:

 Connection conn = DBConnectionManagerFactory.getDBConnectionManager().getConnection();
    CallableStatement cstmt = null;
    ResultSet rs = null;
    String community = "EXAMPLE";

    try
    {
        cstmt = conn.prepareCall("{call example_SP.get_terminals@remote_address(?,?)}");
        cstmt.setString(1, community);
        cstmt.registerOutParameter(2, OracleTypes.CURSOR);

        cstmt.execute();

        rs = (ResultSet)cstmt.getObject(2);

        while (rs.next())
        {
              LogUtil.getLog().logInfo("Terminal code=" + rs.getString( "cd_terminal" ));
        }

    }
4

1 に答える 1

3

オプション1.ローカルデータベースを経由するのではなく、Javaからリモートデータベースへの直接接続を選択します。より単純ですが、2つの別々のトランザクションを調整するのはアプリケーション次第です。1つのデータベースが書き込みではなく読み取りにのみ使用される場合は、このルートを使用します。

ストレートクエリまたはストアドプロシージャと参照カーソルで使用できます。ストアドプロシージャレイヤーを追加する正当な理由がない限り、通常は前者を使用します。

オプション2.データベースリンクを使用して、ローカルデータベースで直接クエリを実行します。

オプション3.(2)と同じですが、ローカルデータベースに保存されているビュー(またはシノニム)でクエリを非表示にします。

オプション4.結果セットが十分に小さい場合は、ローカルデータベースのプロシージャでリモートデータベースのプロシージャを呼び出すことができます。リモートプロシージャは、結果をXMLまたは構造化CLOB(JSONなど)として返します。これは、ローカルプロシージャまたはJavaレイヤーのいずれかによって「デコード」できます。

于 2010-03-31T00:36:20.753 に答える