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

时间:2017-07-25 20:19:58

标签: oracle jdbc jmeter cursor procedure

我有一个过程,它接受一个VARCHAR参数并返回一个OUT CURSOR,这是一个列表,在这种情况下是3行,有9列。

我当前的JDBC请求:

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

回复数据:

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

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

我已经尝试从BeanShell样本器中的outList获取一些信息,如建议here,但除了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请求设置中缺少的东西?

2 个答案:

答案 0 :(得分:1)

我终于通过远离JDBC Request sampler并使用BeanShell Sampler来解决这个问题。

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 :(得分:0)

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

    import java.sql.ResultSet
    
    ResultSet rs = (ResultSet)vars.getObject('outList')
    
    while (rs.next()) {            
        vars.put('column_1_row_1_value`, rs.getString(0)) 
        ///...
    }
    
  3. 有关详细信息,请参阅JDBC TutorialApache Groovy - Why and How You Should Use It