pio*_*jow 5 java mysql sql-types jdbc
我正在使用 jdbc CallableStatement 来执行 MySQL 数据库中的过程。在编写单元测试时,我遇到了关于 registerOutParameter 方法的奇怪行为。
使用的 SQL 过程
PROCEDURE TEST_DOUBLE( OUT val DOUBLE ) BEGIN SET val = 2.5; END
PROCEDURE TEST_TEXT( OUT val TEXT ) BEGIN SET val = 'test'; END
Run Code Online (Sandbox Code Playgroud)
测试
statement = connection.prepareCall( "CALL TEST_DOUBLE(?)" );
statement.registerOutParameter( "val" , java.sql.Types.INTEGER );
statement.execute();
statement.getInt( "val" ); //Integer 2
statement.getDouble( "val" ); //Double 2.5
statement.getString( "val" ); //String "2.5"
statement = connection.prepareCall( "CALL TEST_TEXT(?)" );
statement.registerOutParameter( "val" , java.sql.Types.INTEGER );
statement.execute();
statement.getInt( "val" ); //Invalid value for getInt
statement.getDouble( "val" ); //Invalid value for getDouble
statement.getString( "val" ); //String "test"
statement = connection.prepareCall( "CALL TEST_TEXT(?)" );
statement.registerOutParameter( "val" , 0 );
statement.execute();
statement.getInt( "val" ); //Invalid value for getInt
statement.getDouble( "val" ); //Invalid value for getDouble
statement.getString( "val" ); //String "test"
Run Code Online (Sandbox Code Playgroud)
等等...
我的观点是 - 传递给 registerOutParameter 的值 java.sql.Types.* 似乎什么也没做...无论我传递什么 sql 类型,一切都取决于调用正确的 getter 方法和数据库返回的实际值。
我可以在任何地方传递 0 并且它无论如何都会正常工作吗?那为什么要传递这个参数呢?或者也许这个数据库相关,并且对于其他数据库来说它是有意义的?
我猜测这个参数与数据库相关。Oracle当然重视这一点:
statement = connection.prepareCall("CALL_TEST_NUMBER(?)");
statement.registerOutParameter("val", java.sql.Types.INTEGER);
statement.execute();
statement.getInt("val"); // 2
statement.getDouble("val"); // 2.5
statement.getString("val"); // "2.5"
statement = connection.prepareCall("CALL TEST_TEXT(?)");
statement.registerOutParameter("val", java.sql.Types.INTEGER);
statement.execute(); // java.sql.SQLSyntaxErrorException: ORA-01722: invalid number
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4685 次 |
| 最近记录: |