首页 文章

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

提问于
浏览
0

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

这是我的SQL查询:

声明outinfo varchar2(20); outtable sys_refcursor; begin {call RK_JSCX(?,?)};结束;

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

示例开始时间:2012-10-25 16:06:41 CST加载时间:0延迟:0大小(字节):25标头大小(字节):0主体大小(字节):25样本计数:1错误计数:1响应代码: null 0响应消息:java.sql.SQLException:无效的数据类型:cursor

响应头: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);
}

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版本中),请参阅:

  • 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驱动程序

相关问题