2012-10-23 107 views
0

我想通过使用jmeter来测试Oracle存储过程。我已经完成了除参数以外的所有操作。如何使用jmeter使用sys_refcursor返回类型来测试Oracle存储过程?

这里是我的SQL查询:

声明 outinfo VARCHAR2(20); outtable sys_refcursor; begin {call RK_JSCX(?,?)}; 结束;

Oracle中的outtable是一个cursor.And我使用了resultSet来包含它在java.However,无论我在参数类型中设置,它说无效类型。

采样开始:2012年10月25日16时06分41秒CST 装载时间:0 延迟:0 字节大小:25 头大小的字节数:0 字节车身尺寸:25 样品数:1个 错误计数:1个 响应代码:空0 响应消息:值java.sql.SQLException:无效数据类型:光标

响应头: [email protected]

SampleResult领域: 的ContentType:text/plain的 DataEncoding:UTF-8

如何解决这个问题? 谢谢!

这是我在Java代码:

public String RK_JSCX() throws Exception { 

    RK_JSCX_Response response = null; 
    List<RK_JSCX_Outtable> list = null; 
    Connection con = null; 
    CallableStatement cs = null; 
    ResultSet rs = null; 
    String sql = null; 
    try { 
     sql = "{call RK_JSCX(?,?)}"; 
     con = ConnectionUtils.getInstance().getConnect(); 

     if (con.isClosed()) { 
      throw new IllegalStateException("ERROR.THE CONNECTION ISCLOSED"); 
     } 

     cs = con.prepareCall(sql); 
     cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); 
     cs.registerOutParameter(2, Types.VARCHAR); 

     cs.execute(); 

     rs = (ResultSet) cs.getObject(1); 
     list = new ArrayList<RK_JSCX_Outtable>(); 
     while (rs.next()) { 

      RK_JSCX_Outtable out = new RK_JSCX_Outtable(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getInt(5), rs.getString(6)); 

      list.add(out); 
     } 
     String outInfo = cs.getString(2); 
     response = new RK_JSCX_Response(list, outInfo); 

    } catch (SQLException e) { 

     e.printStackTrace(); 

    } catch (Exception e) { 
     e.printStackTrace(); 

    }finally { 

     try { 
      if (rs != null) { 
       rs.close(); 
       if (cs != null) { 
        cs.close(); 
       } 
       if (con != null) { 
        con.close(); 
       } 
      } 
     } catch (SQLException e) { 

      System.out.println("Exception2"); 
      e.printStackTrace(); 
     } 
    } 
    return JSON.toJSONString(response); 
} 
+0

您可以发布您的代码,你在呼唤你的Oracle从Java存储过程? – user75ponic

+0

是的,我已经添加了我的代码。 – luting

+0

所以你在这里得到异常'cs = con.prepareCall(sql); cs.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR); cs.registerOutParameter(2,Types.VARCHAR);'你的程序收到一个正确的参数? – user75ponic

回答

3

这是如何做到这一点:

  • SQL查询:拨打RK_JSCX(? ,?)

  • Pa这些参数值:OUT,OUT

  • 参数类型:OUT -10,OUT VARCHAR

    -10是OracleTypes.CURSOR

  • 变量名的int值:光标,outInfo

    Names are what you want 
    

JMeter允许使用比java.sql.Types常量更多的类型,在这种情况下,而不是使用常量名称,您使用常量的整数值。

文档已澄清(在下一版本的JMeter),请参阅:

+0

感谢您的建议。我认识到类型错误。它可以修复吗?您的意思是我应该使用其他采样器?我阅读JSR223采样器的文档,但我仍然不知道如何处理它。 – luting

+0

你好,是的,我正在提议。在java中调用jdbc调用并通过jsr223采样器调用它。使用OracleTypes.CURSOR和OracleCallableStatement在SO上搜索示例。 –

+0

对不起,我忘了。 – luting

1

与下面的示例中调用过程

cs = con.prepareCall("BEGIN RK_JSCX(?, ?); END;"); 

改变

变化的语法,我相信你的第一个OUT参数VARCHAR2对不对?所以

cs.registerOutParameter(1, Types.VARCHAR); 

然后 使用以下方法来投的CallableStatement

rs = ((OracleCallableStatement)cs).getCursor(2); 

更新1

我已经改变了你的程序演示的工作版本

程序

CREATE OR REPLACE PROCEDURE rk_jscx (outtable OUT sys_refcursor, 
               outinfo OUT VARCHAR2 
               ) 
AS 
BEGIN 
    OPEN outtable FOR 
     SELECT SYSDATE 
      FROM DUAL; 

    outinfo := 1; 
EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN 
     outinfo := 2; 
     ROLLBACK; 
END rk_jscx; 

的Java代码

CallableStatement stmt = conn.prepareCall("BEGIN rk_jscx(?, ?); END;"); 
stmt.registerOutParameter(1, OracleTypes.CURSOR); 
stmt.registerOutParameter(2, Types.VARCHAR); 
stmt.execute(); 
     ResultSet rs = ((OracleCallableStatement)stmt).getCursor(1); 
     while (rs.next()) { 
     System.out.println(rs.getDate("sysdate")); 
     } 

上面打印2012-10-23

检查JDBC驱动程序以及

+0

有一个ClassCastException。因为con.prepareCall()返回一个CallableStatement并且它不能转换为oracle.jdbc.OracleCallableStatement – luting

+0

你在哪里得到ClassCastException?在这行'rs =((OracleCallableStatement)cs).getCursor(2);'? – user75ponic

+0

是的,我在这一行得到ClassCastException。 – luting

相关问题