0

jmeter を使用して Oracle ストアド プロシージャをテストしたいと考えています。パラメータ以外はすべて実行しました。

そして、ここに私のSQLクエリがあります:

outinfo varchar2(20) を宣言します。outtable sys_refcursor; begin {call RK_JSCX(?,?)}; 終わり;

Oracle の出力テーブルはカーソルです。そして、resultSet を使用してそれを Java に含めました。

サンプル開始: 2012-10-25 16:06:41 CST 読み込み時間: 0 レイテンシ: 0 サイズ (バイト): 25 ヘッダー サイズ (バイト): 0 本体サイズ (バイト): 25 サンプル数: 1 エラー数: 1 応答コード: null 0 応答メッセージ: java.sql.SQLException: 無効なデータ型: カーソル

応答ヘッダー: oracle.jdbc.driver.T4CConnection@58ba09

SampleResult フィールド: ContentType: text/plain DataEncoding: UTF-8

どうすれば修正できますか?ありがとう!

Javaでの私のコードは次のとおりです。

public String RK_JSCX() throws Exception {

    RK_JSCX_Response response = null;
    List<RK_JSCX_Outtable> list = null;
    Connection con = null;
    CallableStatement cs = null;
    ResultSet rs = null;
    String sql = null; 
    try {
        sql = "{call RK_JSCX(?,?)}";
        con = ConnectionUtils.getInstance().getConnect();

        if (con.isClosed()) {
            throw new IllegalStateException("ERROR.THE   CONNECTION   ISCLOSED");
        }

        cs = con.prepareCall(sql);
        cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
        cs.registerOutParameter(2, Types.VARCHAR);

        cs.execute();

        rs = (ResultSet) cs.getObject(1);
        list = new ArrayList<RK_JSCX_Outtable>();
        while (rs.next()) {

            RK_JSCX_Outtable out = new RK_JSCX_Outtable(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getInt(5), rs.getString(6));

            list.add(out);
        }
        String outInfo = cs.getString(2);
        response = new RK_JSCX_Response(list, outInfo);

    } catch (SQLException e) {

        e.printStackTrace();

    } catch (Exception e) {
        e.printStackTrace();

    }finally {

        try {
            if (rs != null) {
                rs.close();
                if (cs != null) {
                    cs.close();
                }
                if (con != null) {
                    con.close();
                }
            }
        } catch (SQLException e) {

            System.out.println("Exception2");
            e.printStackTrace();
        }
    }
    return JSON.toJSONString(response);
}
4

2 に答える 2

3

これを行う方法は次のとおりです。

  • SQL クエリ : RK_JSCX(?,?) を呼び出す

  • パラメータ値:OUT、OUT

  • パラメータのタイプ: OUT -10,OUT VARCHAR

    -10 は OracleTypes.CURSOR の int 値です。

  • 変数名:cursor、outInfo

     Names are what you want
    

JMeter では、java.sql.Types 定数よりも多くの型を使用できます。この場合、定数名を使用する代わりに、定数の整数値を使用します。

ドキュメントが明確化されました (次の JMeter バージョンで)。以下を参照してください。

于 2012-10-23T21:11:02.547 に答える
1

次の変更を試してください

プロシージャを呼び出す際の構文を変更して

cs = con.prepareCall("BEGIN RK_JSCX(?, ?); END;");

そして、あなたの最初の OUT パラメータは VARCHAR2 ですよね?それで

cs.registerOutParameter(1, Types.VARCHAR);

次に、以下を使用して CallableStatement をキャストします

rs = ((OracleCallableStatement)cs).getCursor(2);

更新 1

作業バージョンを示すために手順を変更しました

手順

CREATE OR REPLACE PROCEDURE rk_jscx (outtable   OUT sys_refcursor,
                                                 outinfo    OUT VARCHAR2
                                                )
AS
BEGIN
    OPEN outtable FOR
        SELECT  SYSDATE
          FROM  DUAL;

    outinfo := 1;
EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        outinfo := 2;
        ROLLBACK;
END rk_jscx;

Java コード

CallableStatement stmt = conn.prepareCall("BEGIN rk_jscx(?, ?); END;");
 stmt.registerOutParameter(1, OracleTypes.CURSOR); 
 stmt.registerOutParameter(2, Types.VARCHAR);
 stmt.execute();
      ResultSet rs = ((OracleCallableStatement)stmt).getCursor(1);
      while (rs.next()) {
        System.out.println(rs.getDate("sysdate")); 
      }

上記の印刷物2012-10-23

jdbcドライバーも確認してください

于 2012-10-23T10:46:22.233 に答える