我有一个过程,它接受一个 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();
}
}
- 添加 JSR223 后处理器作为请求的子处理器
-
按照从结果集中检索和修改值一文从
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——为什么以及如何使用它以获取更多详细信息。