
# java.sql.CallableStatement
java.sql.CallableStatement是存储过程执行接口。
表1对java.sql.CallableStatement的支持情况 
| 方法名                                                             | 返回值类型      | 支持JDBC4 |
|:---|:---|:---|
| getArray(int parameterIndex)                                    | Array      | Yes     |
| getBigDecimal(int parameterIndex)                               | BigDecimal | Yes     |
| getBlob(int parameterIndex)                                     | Blob       | Yes     |
| getBoolean(int parameterIndex)                                  | boolean    | Yes     |
| getByte(int parameterIndex)                                     | byte       | Yes     |
| getBytes(int parameterIndex)                                    | byte\[\]   | Yes     |
| getClob(int parameterIndex)                                     | Clob       | Yes     |
| getDate(int parameterIndex)                                     | Date       | Yes     |
| getDate(int parameterIndex, Calendar cal)                       | Date       | Yes     |
| getDouble(int parameterIndex)                                   | double     | Yes     |
| getFloat(int parameterIndex)                                    | float      | Yes     |
| getInt(int parameterIndex)                                      | int        | Yes     |
| getLong(int parameterIndex)                                     | long       | Yes     |
| getObject(int parameterIndex)                                   | Object     | Yes     |
| getObject(int parameterIndex, Class\<T\> type)                  | Object     | Yes     |
| getRowId(int parameterIndex)                                    | RowId      | Yes     |
| getShort(int parameterIndex)                                    | short      | Yes     |
| getSQLXML(int parameterIndex)                                   | SQLXML     | Yes     |
| getString(int parameterIndex)                                   | String     | Yes     |
| getNString(int parameterIndex)                                  | String     | Yes     |
| getTime(int parameterIndex)                                     | Time       | Yes     |
| getTime(int parameterIndex, Calendar cal)                       | Time       | Yes     |
| getTimestamp(int parameterIndex)                                | Timestamp  | Yes     |
| getTimestamp(int parameterIndex, Calendar cal)                  | Timestamp  | Yes     |
| registerOutParameter(int parameterIndex, int type)              | void       | Yes     |
| registerOutParameter(int parameterIndex, int sqlType, int type) | void       | Yes     |
| wasNull()                                                       | boolean    | Yes     |
   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 不允许含有OUT参数的语句执行批量操作。
- 以下方法是从java.sql.Statement继承而来：close、execute、executeQuery、executeUpdate、getConnection、getResultSet、getUpdateCount、isClosed、setMaxRows、setFetchSize。
- 以下方法是从java.sql.PreparedStatement继承而来：addBatch、clearParameters、execute、executeQuery、executeUpdate、getMetaData、setBigDecimal、setBoolean、setByte、setBytes、setDate、setDouble、setFloat、setInt、setLong、setNull、setObject、setString、setTime、setTimestamp。
- registerOutParameter(int parameterIndex, int sqlType, int type)方法仅用于注册复合数据类型，其它类型不支持。
 
表2java.sql.CallableStatement可支持的接口（仅在ORA兼容的模式支持，需要设置连接参数oracleCompatible=functionsCompatible） 
| 方法名                                                                      | 返回值类型           | 支持JDBC4 |
|:---|:---|:---|
| setNString(String parameterName, String value)                           | void            | Yes     |
| setClob(String parameterName, Reader reader, long length)                | void            | Yes     |
| setClob(String parameterName, Reader reader)                             | void            | Yes     |
| setBlob(String parameterName, InputStream inputStream, long length)      | void            | Yes     |
| setBlob(String parameterName, InputStream inputStream)                   | void            | Yes     |
| setBlob(String parameterName, Blob x)                                    | void            | Yes     |
| setClob(String parameterName, Clob x)                                    | void            | Yes     |
| setSQLXML(String parameterName, SQLXML xmlObject)                        | void            | Yes     |
| setNull(String parameterName, int sqlType)                               | void            | Yes     |
| setBoolean(String parameterName, boolean x)                              | void            | Yes     |
| setByte(String parameterName, byte x)                                    | void            | Yes     |
| setShort(String parameterName, short x)                                  | void            | Yes     |
| setInt(String parameterName, int x)                                      | void            | Yes     |
| setLong(String parameterName, long x)                                    | void            | Yes     |
| setFloat(String parameterName, float x)                                  | void            | Yes     |
| setDouble(String parameterName, double x)                                | void            | Yes     |
| setBigDecimal(String parameterName, BigDecimal x)                        | void            | Yes     |
| setString(String parameterName, String x)                                | void            | Yes     |
| setBytes(String parameterName, byte\[\] x)                               | void            | Yes     |
| setDate(String parameterName, java.sql.Date x)                           | void            | Yes     |
| setTime(String parameterName, Time x)                                    | void            | Yes     |
| setTimestamp(String parameterName, Timestamp x)                          | void            | Yes     |
| setObject(String parameterName, Object x, int targetSqlType, int scale)  | void            | Yes     |
| setObject(String parameterName, Object x, int targetSqlType)             | void            | Yes     |
| setObject(String parameterName, Object x)                                | void            | Yes     |
| setDate(String parameterName, java.sql.Date x, Calendar cal)             | void            | Yes     |
| setTime(String parameterName, Time x, Calendar cal)                      | void            | Yes     |
| setTimestamp(String parameterName, Timestamp x, Calendar cal)            | void            | Yes     |
| setNull(String parameterName, int sqlType, String typeName)              | void            | Yes     |
| setRowId(String parameterName, RowId x)                                  | void            | Yes     |
| getObject(String parameterName)                                          | Object          | Yes     |
| getBoolean(String parameterName)                                         | boolean         | Yes     |
| getByte(String parameterName)                                            | byte            | Yes     |
| getShort(String parameterName)                                           | short           | Yes     |
| getInt(String parameterName)                                             | int             | Yes     |
| getLong(String parameterName)                                            | long            | Yes     |
| getFloat(String parameterName)                                           | float           | Yes     |
| getDouble(String parameterName)                                          | double          | Yes     |
| getBytes(String parameterName)                                           | byte\[\]        | Yes     |
| getArray(String parameterName)                                           | Array           | Yes     |
| getDate(String parameterName)                                            | java.sql.Date   | Yes     |
| getDate(String parameterName, Calendar cal)                              | java.sql.Date   | Yes     |
| getString(String parameterName)                                          | String          | Yes     |
| getClob(String parameterName)                                            | Clob            | Yes     |
| getSQLXML(String parameterName)                                          | java.sql.SQLXML | Yes     |
| getNString(String parameterName)                                         | String          | Yes     |
| getBigDecimal(String parameterName)                                      | BigDecimal      | Yes     |
| getBlob(String parameterName)                                            | Blob            | Yes     |
| getTimestamp(String parameterName)                                       | Timestamp       | Yes     |
| getTimestamp(String parameterName, Calendar cal)                         | Timestamp       | Yes     |
| getRowId(String parameterName)                                           | RowId           | Yes     |
| execute()                                                                | boolean         | Yes     |
| wasNull()                                                                | boolean         | Yes     |
| registerOutParameter(String parameterName, int sqlType)                  | void            | Yes     |
| registerOutParameter(String parameterName, int sqlType, int scale)       | void            | Yes     |
| registerOutParameter(String parameterName, int sqlType, String typeName) | void            | Yes     |
   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 需要设置连接参数oracleCompatible=functionsCompatible。
- 不支持对于出参（包含返回值）有且仅有一个且类型是record的存储过程。
- 不支持注册为Types.NULL、Types.OTHER、Types.JAVA_OBJECT、 Types.DISTINCT。
- 仅支持call语法，推荐使用索引的方式。
- CallableStatement的get方法类型转换能力与ResultSet相对应的get方法类型转换能力保持一致。
- registerOutParameter接口支持注册与存过定义参数类型不一致的sqlType。
  - proc_outparam_override参数未开启时，理论上所有sqlType都能注册（除了不支持的sqlType）；
  
  - proc_outparam_override参数开启时，注册sqlType会绑定类型oid，数据库内核会判断该类型是否支持隐式转换到定义的类型，若不支持隐式转换会报错。
   
 
getObject(Int parameterIndex)和getObject(String parameterName)获取的类型与返回值类型无关，与注册的sqlType有关。注册sqlType对应返回值类型，如[表3]所示。
 表3注册sqlType对应返回值类型 
| sqlType                       | 实际返回值类型     |
|:---|:---|
| Types.BIT                     | boolean     |
| Types.BOOLEAN                 | boolean     |
| Types.TINYINT                 | byte        |
| Types.SMALLINT                | short       |
| Types.INTEGER                 | int         |
| Types.BIGINT                  | long        |
| Types.REAL                    | float       |
| Types.FLOAT                   | double      |
| Types.DOUBLE                  | double      |
| Types.DECIMAL                 | BigDecimal  |
| Types.NUMERIC                 | BigDecimal  |
| Types.CHAR                    | String      |
| Types.VARCHAR                 | String      |
| Types.LONGVARCHAR             | String      |
| Types.DATALINK                | String      |
| Types.NCHAR                   | String      |
| Types.NVARCHAR                | String      |
| Types.LONGNVARCHAR            | String      |
| Types.NCLOB                   | NClob(暂不支持) |
| Types.DATE                    | Date        |
| Types.TIME                    | Time        |
| Types.TIME_WITH_TIMEZONE      | Time        |
| Types.TIMESTAMP               | Timestamp   |
| Types.TIMESTAMP_WITH_TIMEZONE | Timestamp   |
| Types.CLOB                    | Clob        |
| Types.BLOB                    | Blob        |
| Types.BINARY                  | byte\[\]    |
| Types.VARBINARY               | byte\[\]    |
| Types.LONGVARBINARY           | byte\[\]    |
| Types.ARRAY                   | Array       |
| Types.STRUCT                  | Record      |
| Types.REF                     | Ref(暂不支持)   |
| Types.ROWID                   | RowId       |
| Types.SQLXML                  | SQLXML      |
| Types.REF_CURSOR              | ResultSet   |
   
