我想使用jmeter测试Oracle存储过程。我已完成除参数之外的所有操作。
这是我的SQL查询:
声明 outinfo varchar2(20); outtable sys_refcursor; 开始 {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);
}
答案 0 :(得分:3)
这是怎么做的:
SQL查询:调用RK_JSCX(?,?)
参数值:OUT,OUT
参数类型:OUT -10,OUT VARCHAR
-10是OracleTypes.CURSOR
变量名称:cursor,outInfo
Names are what you want
JMeter允许使用比java.sql.Types常量更多的类型,在这种情况下,不使用常量名称,而是使用常量的整数值。
文档已经澄清(在下一个JMeter版本中),请参阅:
答案 1 :(得分: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驱动程序