jdbc的registerOutParameter中的sqlType是什么意思?

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 并且它无论如何都会正常工作吗?那为什么要传递这个参数呢?或者也许这个数据库相关,并且对于其他数据库来说它是有意义的?

Luk*_*ard 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)