来自 Oracle 过程的可读输出 returns JMeter 中的游标

Readable output from Oracle procedure that returns a cursor in JMeter

我有一个过程接受一个 VARCHAR 参数和 returns 一个 OUT CURSOR 列表,在本例中为 3 行 9 列。

我当前的JDBC请求:

CALL foo.bar.procedure('123456', ?)

响应数据:

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

outList 现在是 oracle.jdbc.driver.OracleResultSetImpl@21512d0b

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

我是通过 Jmeter 调用程序的新手,View Result Tree 似乎没有向我显示任何结果数据,我一直在 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 请求设置中是否缺少某些内容?

  1. JSR223 PostProcessor 添加为您请求的子项
  2. 根据 Retrieving and Modifying Values from Result Sets 文章从 OracleResultSetImpl 中提取 "interesting" 值,例如:

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

有关详细信息,请参阅 JDBC Tutorial and Apache Groovy - Why and How You Should Use It

我最终通过放弃 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();
    }
}