2017-07-25 10 views
0

1つのVARCHARパラメータを取り、リストであるOUT CURSOR(この場合は9行の3行)を戻すプロシージャがあります。JMeterでカーソルを返すOracleプロシージャからの読み込み可能な出力

私の現在のJDBC要求:

CALL foo.bar.procedure('123456', ?) 
  • クエリのタイプ:コール可能文
  • パラメータ値:OUT
  • パラメータタイプ:OUT -10
  • 変数名:OUTLIST
  • 結果変数名:resultList(これは常にnullですが、結果が空であることを意味しますか?)
  • ハンドルのResultSet:ストアはObjectとして

レスポンスデータ:

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

OUTLISTは今[email protected]

hereを示唆しているように私はBeanShellのサンプラーで出力リストからいくつかの情報を取得しようとしましたが、 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要求の設定で不足しているものですかな?

答えて

0

最後に、JDBC Requestサンプラーから離れて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. OracleResultSetImplとしてRetrieving and Modifying Values from Result Setsあたりの記事から "面白い" の値を抽出し、あなたの要求の子としてJSR223 PostProcessorを追加し、何かのように:

    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 Requestサンプラーから離れ、BeanShellサンプラーからプロシージャーを呼び出して、ソリューションを使用して出力を保管することで、問題を解決しました。すぐに私のソリューションを投稿します。 ありがとうDmitri – einaralex

関連する問題