如何使用 jmeter 测试具有 sys_refcursor 返回类型的 Oracle 存储过程?

我想使用 jmeter 测试一个 Oracle 存储过程.我已经完成了除参数之外的所有工作.

I want to test an Oracle Stored Procedure by using jmeter.I have done everything but parameters.

这是我的 SQL 查询:

And here is my SQL Query:

声明outinfo varchar2(20);outtable sys_refcursor;开始{调用 RK_JSCX(?,?)};结束;

declare outinfo varchar2(20); outtable sys_refcursor; begin {call RK_JSCX(?,?)}; end;

Oracle 中的 outtable 是一个游标.我使用 resultSet 将它包含在 java 中.但是,无论我在参数类型中设置什么,它都表示无效类型.

The outtable in Oracle is a cursor.And i used resultSet to contain it in java.However,whatever i set in parameter types ,it said invalid type.

样品开始时间:2012-10-25 16:06:41 CST加载时间:0延迟:0大小(以字节为单位):25标头大小(以字节为单位):0正文大小(以字节为单位):25样本数:1错误计数:1响应代码:空 0响应消息:java.sql.SQLException:无效的数据类型:游标

Sample Start: 2012-10-25 16:06:41 CST Load time: 0 Latency: 0 Size in bytes: 25 Headers size in bytes: 0 Body size in bytes: 25 Sample Count: 1 Error Count: 1 Response code: null 0 Response message: java.sql.SQLException: Invalid data type: cursor

响应头:oracle.jdbc.driver.T4CConnection@58ba09

Response headers: oracle.jdbc.driver.T4CConnection@58ba09

SampleResult 字段:内容类型:文本/纯文本数据编码:UTF-8

SampleResult fields: ContentType: text/plain DataEncoding: UTF-8

如何解决?谢谢!

这是我的Java代码:

Here is my code in 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);
}

推荐答案

这是怎么做的:

  • SQL 查询:调用 RK_JSCX(?,?)

  • SQL Query : call RK_JSCX(?,?)

参数值:OUT、OUT

Parameter values : OUT, OUT

参数类型:OUT -10,OUT VARCHAR

Parameter types : OUT -10,OUT VARCHAR

-10 是 OracleTypes.CURSOR 的 int 值

-10 being the int value of OracleTypes.CURSOR

变量名:cursor, outInfo

Variable names: cursor, outInfo

 Names are what you want

JMeter 允许使用比 java.sql.Types 常量更多的类型,在这种情况下,不是使用常量名称,而是使用常量的整数值.

JMeter allows using more types than java.sql.Types constants, in this case instead of using Constant names, you use integer values of constants.

文档已经澄清(在下一个 JMeter 版本中),请参阅:

Documentation has been clarified (in next JMeter version) , see:

  • https://issues.apache.org/bugzilla/show_bug.cgi?id=54048

相关文章