jdbc的registerOutParameter中的sqlType是什么意思?
What is the meaning of sqlType in registerOutParameter of 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
测试
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"
等等...
我的观点是 - 传递给 registerOutParameter 的值 java.sql.Types.* 似乎什么都不做......无论我传递什么 sql 类型,一切都取决于调用正确的 getter 方法以及数据库返回的真实值。
我可以在所有地方都通过 0 并且它无论如何都能正常工作吗?
那为什么要传递这个参数呢?
还是这个数据库相关,对其他数据库有意义?
此方法需要此参数中的整数,如您在 jdbc documentation. The field you use as a constant (java.sql.Types.INTEGER) is a int (public static final int INTEGER) as all the rest of constant values in java.sql.Types 中所见,这就是为什么您的代码在您输入 0 时有效(可能 0 值与 [=15 相同) =] 或其他数字类型)。
此参数告诉驱动程序您希望为此输出值读取哪种类型。
当您尝试使用另一个 java.sql.Type(即 java.sql.Type.ARRAY)时,您可能会遇到类转换或转换错误,因为 jdbc 驱动程序不知道如何转换该值从 de callableStatement(一个数字)返回到你想要的类型(一个数组)。
我猜这个参数是数据库相关的。 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
我正在使用 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
测试
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"
等等...
我的观点是 - 传递给 registerOutParameter 的值 java.sql.Types.* 似乎什么都不做......无论我传递什么 sql 类型,一切都取决于调用正确的 getter 方法以及数据库返回的真实值。
我可以在所有地方都通过 0 并且它无论如何都能正常工作吗? 那为什么要传递这个参数呢? 还是这个数据库相关,对其他数据库有意义?
此方法需要此参数中的整数,如您在 jdbc documentation. The field you use as a constant (java.sql.Types.INTEGER) is a int (public static final int INTEGER) as all the rest of constant values in java.sql.Types 中所见,这就是为什么您的代码在您输入 0 时有效(可能 0 值与 [=15 相同) =] 或其他数字类型)。 此参数告诉驱动程序您希望为此输出值读取哪种类型。
当您尝试使用另一个 java.sql.Type(即 java.sql.Type.ARRAY)时,您可能会遇到类转换或转换错误,因为 jdbc 驱动程序不知道如何转换该值从 de callableStatement(一个数字)返回到你想要的类型(一个数组)。
我猜这个参数是数据库相关的。 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