来自 Oracle 过程的可读输出,在 JMeter 中返回游标



我有一个过程,它接受一个 VARCHAR 参数并返回一个 OUT CURSOR,它是一个列表,在本例中为 3 行,9 列。

我当前的 JDBC 请求:

CALL foo.bar.procedure('123456', ?)
  • 查询类型:可调用语句
  • 参数值:OUT
  • 参数类型:OUT -10
  • 变量名称:输出列表
  • 结果
  • 变量名称:resultList(这始终为空,是否意味着结果为空?
  • 句柄结果集:存储为对象

响应数据:

-1 updates.
Output variables by position:
[1] oracle.jdbc.driver.OracleResultSetImpl@21512d0b

outList 现已oracle.jdbc.driver.OracleResultSetImpl@21512d0b

我尝试从 BeanShell 采样器中的 outList 获取一些信息,就像这里建议的那样,但除了 ResultSet 对象 ID 之外,我无法从中获取任何信息。

我是通过 Jmeter 调用过程的新手,查看结果树似乎没有向我显示任何结果数据,我一直在来回使用 SQL 查询和参数值,试图修复它,但我总是遇到同样的问题输出。

我也尝试过类似设置的类似方法:

DECLARE
refCursor sys_refcursor;
Type MyRec Is Record (
v1    varchar2(
v2    varchar2(50),
...
v13    varchar2(10));
rec MyRec;   
BEGIN
foo.bar.procedure('123456',refCursor);
LOOP
FETCH refCursor INTO rec;
EXIT WHEN refCursor%NOTFOUND;
dbms_output.put_line(
rec.v1||','||
rec.v2||','||
...
rec.v13);
END LOOP;
END;

我是否正确调用了该过程,或者 JDBC 请求设置中缺少某些内容?

我最终通过摆脱 JDBC 请求采样器并使用 BeanShell 采样器来解决这个问题。

import java.sql.*;
import oracle.jdbc.*;
import org.apache.jmeter.protocol.jdbc.config.DataSourceElement;
ResultSet rs = null;
ResultSetMetaData rsmd = null;
CallableStatement stmt;
// "myConnConfigName" is the 'JDBC Connection Configuration' variable name
Connection conn = DataSourceElement.getConnection("myConnConfigName");
try {
stmt = conn.prepareCall("CALL foo.bar.procedure(?,?)");
stmt.setString(1, "123456");
stmt.registerOutParameter(2, OracleTypes.CURSOR);
stmt.executeUpdate();
rs = (ResultSet) stmt.getObject(2);
while (rs.next()) {
rsmd = rs.getMetaData();
log.info("ColumnCount:" + rsmd.getColumnCount().toString());
log.info("RowNo:" + rs.getRow().toString());
// TODO: Store data.
//       Loop through columns with rs.getString(i);
}
}
catch(Throwable ex) {
log.error("Error message: ", ex);
throw ex;
}
finally {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
  1. 添加 JSR223 后处理器作为请求的子处理器
  2. 按照从结果集中检索和修改值一文从OracleResultSetImpl中提取"感兴趣的"值,如下所示:

    import java.sql.ResultSet
    ResultSet rs = (ResultSet)vars.getObject('outList')
    while (rs.next()) {            
    vars.put('column_1_row_1_value`, rs.getString(0)) 
    ///...
    }
    

请参阅 JDBC 教程 和 Apache Groovy——为什么以及如何使用它以获取更多详细信息。

最新更新