2017-07-25 16 views
0

返回遊標我有需要在一個VARCHAR參數,並返回一個OUT CURSOR這是一個列表,在這種情況下3行與9列的過程。可讀的輸出,在JMeter的

我目前的JDBC請求:

CALL foo.bar.procedure('123456', ?) 
  • 查詢類型:可調用語句
  • 參數值:OUT
  • 參數類型:OUT -10
  • 變量名:OUTLIST
  • 結果變量名:resultList(這是始終爲空,豈不是結果是空的?)
  • 手柄的ResultSet:存儲爲對象

響應數據:

-1 updates. 
Output variables by position: 
[1] [email protected] 

OUTLIST現在[email protected]

我已經試過正從OUTLIST在BeanShell中取樣的一些信息,如建議here但除了只有ResultSet對象標識以外,我一直無法從中獲取任何內容。

我是新來的,通過調用程序的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請求設置丟失?

回答

0

我終於通過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(); 
    } 
} 
0
  1. 添加JSR223 PostProcessor爲您的要求
  2. 從每Retrieving and Modifying Values from Result SetsOracleResultSetImpl作爲製品提取的 「有趣」 的值的孩子,像這樣:

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

JDBC TutorialApache Groovy - Why and How You Should Use It爲更多細節。

+0

我沒有得到這個與JDBC請求採樣器一起工作,我總是收到錯誤「Closed Statement:next」。 我通過移動從JDBC請求採樣離開,並要求從BeanShell的取樣程序,然後使用您的解決方案來存儲輸出解決我的問題。很快會發布我的解決方案。 謝謝德米特里 – einaralex