- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图将 Oracle 存储过程的输出参数存储在我的变量中,但遇到了这个问题:
java.math.BigDecimal cannot be cast to java.lang.Integer
我正在使用StoredProcedure
来自org.springframework.jdbc.object
返回 Map<String, Object>
的执行方法然后我做了这样的事情
Integer proposalId = procedure.execute().get("po_proposal_id");
其中 po_proposal_id 在 PROCEDURE 中定义为
po_proposal_id Out Number,
我知道我可以做这样的事情:
Integer proposalId = ((BigDecimal)
procedure.execute().get("po_proposal_id")).intValue();
但我不想。我为什么要那么做? Spring StoredProcedure 中的执行方法是否始终将 Number SQL 参数映射为 BigDecimal?
我尝试将过程中的参数声明为
po_proposal_id Out Integer,
但运气不佳。
我还尝试更改 Java 中输出参数从 oracle.types.Number 映射到 oracle.types.Integer 的方式,但没有成功。
我找到了这张表Table 3-1 SQL and PL/SQL Data Type to Oracle and JDBC Mapping Classes (你需要向下滚动一点)显示了 oracle 数据类型和 java 之间的映射,但似乎我无法让它工作。
最佳答案
嗨,格罗吉亚, 我将尝试回答我对Spring StoredProcedure类做了一些无聊的分析,当你调用StoredProcedure类的execute方法时,它调用下面的方法
getJdbcTemplate().call(newCallableStatementCreator(inParams), getDeclaredParameters())
经过一系列调用后,它最终调用 ResultSet 类的 getObject(int column index) 方法,该方法依赖于 oracle 的数据库提供程序,mysql 完全不同,该方法负责返回对象的数据类型由列行映射器调用,该映射器映射每个列名称的列以及使用 StoredProcedure 类的相应值
**Column Row Mapper Class :**
@Override
public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
Map<String, Object> mapOfColumnValues = createColumnMap(columnCount);
for (int i = 1; i <= columnCount; i++) {
String column = JdbcUtils.lookupColumnName(rsmd, i);
mapOfColumnValues.put(getColumnKey(column), getColumnValue(rs, i));
}
return mapOfColumnValues;
}
getColumnValue(rs, i) 负责调用 getResultSetValue(ResultSet rs, int index) 方法,该方法负责调用 resultSet 的 getObject(int column index),该方法实际上确定返回的数据类型。
代码示例:
public static Object getResultSetValue(ResultSet rs, int index) throws SQLException {
Object obj = rs.getObject(index);
String className = null;
if (obj != null) {
className = obj.getClass().getName();
}
if (obj instanceof Blob) {
Blob blob = (Blob) obj;
obj = blob.getBytes(1, (int) blob.length());
}
else if (obj instanceof Clob) {
Clob clob = (Clob) obj;
obj = clob.getSubString(1, (int) clob.length());
}
else if ("oracle.sql.TIMESTAMP".equals(className) || "oracle.sql.TIMESTAMPTZ".equals(className)) {
obj = rs.getTimestamp(index);
}
else if (className != null && className.startsWith("oracle.sql.DATE")) {
String metaDataClassName = rs.getMetaData().getColumnClassName(index);
if ("java.sql.Timestamp".equals(metaDataClassName) || "oracle.sql.TIMESTAMP".equals(metaDataClassName)) {
obj = rs.getTimestamp(index);
}
else {
obj = rs.getDate(index);
}
}
else if (obj instanceof java.sql.Date) {
if ("java.sql.Timestamp".equals(rs.getMetaData().getColumnClassName(index))) {
obj = rs.getTimestamp(index);
}
}
return obj;
}
所以来到实际的问题,为什么只有返回的 BigDecimal 类型 ResultSet 类的 getObject(int column index) 方法才会调用 oracle 驱动程序的以下方法
Datum var4 = this.getOracleObject(var1)
它根据列的各个数据类型调用不同的访问器,并且每个访问器都在您的情况下实现了 getObject,oracle 将所有数据类型(例如 int、float)视为数字数据类型,请参阅 https://www.techonthenet.com/oracle/datatypes.php因此它使用 NumberCommonAccessor ,它总是为所有数据类型(例如 int、float)返回 BigDecimal,因此您可以显式类型转换,并且您将一如既往地接收数据类型 BigDecimal。不依赖于 SqlOutParameter,它指定您需要存储过程中的一些输出参数列表,并且它对数据类型没有影响。
关于java - 使用 spring StoredProcedure 将参数输出为 Integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57885670/
我有一个自定义存储过程类,它扩展了 jdbc.StoredProcedure,但我已经使用 Spring @Component 注释了该类,以将该类 bean 引入 Spring 上下文。 我为什么要
我从我的 java 类中调用了一些存储过程。这些存储过程中只有一个似乎没有被调用,但没有抛出异常。存储过程如下所示: CREATE PROCEDURE `insertLoggingMessage` (
我不知道如何使用 Connector/NET 3.6.5 提供的 MySQLCommand。基本上这里是我正在使用的代码和我在运行 ExecuteNonQuery 时得到的异常。我在这里做错了什么?我
我目前有一些使用 JAVA Spring 2.5.2 和 JDBC 编写的代码,用于连接到数据库并执行返回 ResultSet 的存储过程。 。因为所有数据库列都定义为 char (固定长度),我从结
我在 Oracle 中有一个过程,总共有 12 个参数和 3 个可选参数。如果我使用 StoredProcedure,我该如何解释这些可选参数? Spring 3.1.0 中的对象? 这是目前我的 S
我的目标是通过存储过程将数据从一个 SQl azure 数据库(用户 DB)传递到另一个 SQl azure 数据库(数据仓库)。 我创建了两个链接服务,每个数据库一个。还有两个我有疑问的数据集。 相
好的,所以我完全理解使用 SqlParameters 的重要性,这个问题可能看起来有点愚蠢,但我对答案并不完全确定,并想确保我做出正确的决定。 考虑这个简单的 C# 方法: public static
我正在尝试使用 Java 和 Spring 调用 Oracle DB 函数。那里有很多例子。此代码库使用 Spring 版本 4.2.13.RELEASE。这是我的代码: public voi
编辑: 我的问题不再是问题:我重做了我的性能测试,我犯了一个致命的愚蠢错误:我忘记了 x1000 来从毫秒中获取秒数:/对不起那些家伙。 有关信息: - 我每秒从我的 PC 到本地网络上的数据库服务器
我可以选择在我的 DAL 中使用 Entity SQL 查询 或在 db 中使用存储过程水平作为一个选项。 我应该使用哪个。这两种方法的优点/缺点是什么? 我更倾向于 Entity SQL,因为我不希
如何将 ArrayList 作为参数从 Java 类传递给 StoredProcedure? 我有一个方法,从中调用数据库 StoredProcedure,如下面的代码所示: public void
这个问题在这里已经有了答案: When executing a stored procedure, what is the benefit of using CommandType.StoredPr
好的,所以我了解使用 SqlParameters 的重要性,这个问题可能看起来有点愚蠢,但我并不完全确定答案,并希望确保我做出正确的决定。 考虑这个简单的 C# 方法: public static v
我有以下 Oracle PL/SQL 调用,运行得非常好: declare dummy number; begin my.proc(a => 89561, b => 1
我试图将 Oracle 存储过程的输出参数存储在我的变量中,但遇到了这个问题: java.math.BigDecimal cannot be cast to java.lang.Integer 我正在
我正在使用 Mysql 数据库。我必须在其中创建一个包含两个选择语句的存储过程,我想从中返回两个不同的数据集。但是当我创建存储过程时,它只需要第一个 select 语句。我的程序如下, DELIMIT
使用 MS SQL Server。我创建了一个名为 SP_Get_CallsLogged 的存储过程。 我有一个名为 TRN_Call 的表,它有一个名为 CallTime 的列,这是一个 DateT
因此,我尝试使用在 select 语句中传入的 FName 和 LName 参数,从我之前在存储过程中添加到数据库的患者获取 PatientID(主键,非空,自动增量)变量,但我收到语法错误。因此,任
我在 MySQL 中有用户表,我创建了一个存储过程,以便在从 swing 文本字段获取用户名和密码时将它们传递到存储过程中,并了解是否存在要登录的用户,但我实际上无法在 phpMyAdmin 中获取结
我在 python 和 MySQL 中工作,想从存储过程中获取多个数据列表。 我正在使用 PyMySql 连接我的数据库。并尝试做这样的事情但它不起作用 CREATE DEFINER=`root`@`
我是一名优秀的程序员,十分优秀!