- 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/
我正在尝试执行 JavaPairRDD 和 JavaPairRDD 的 leftOuterJoin> 并且函数签名返回类型是 JavaPairRDD>>> 这里可选的是 com.google.comm
我正在尝试按元素的频率对元素进行排序 import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt
这个问题已经有答案了: Is List a subclass of List? Why are Java generics not implicitly polymorphic? (19 个回答) 已
编辑:问题已解决:请参阅 Karim SNOUSSI 的答案和我在下面的评论。 这是我在堆栈溢出时遇到的第一个问题,所以我可能不会一开始就把所有事情都做对。对此感到抱歉。此外,我对 Java 和一般
#include #include using namespace std; class Integer { public: int i; Integer (int ll
我不明白: ArrayList list = new ArrayList(); Collection list1 = new ArrayList(); 类 ArrayList扩展实现接口(interf
我编写了:。它成功了。我不知道为什么?
我编写了:。它成功了。我不知道为什么
我编写了:。它成功了。我不知道为什么?
Collectors.counting()返回 long此方法中每个键的值: private static Map countDuplicates(HashSet cards) { retur
我正在尝试通过搜索旧元素并将其替换为新元素来更新节点的元素。但是有一个我不明白的错误。是什么导致我的代码出现该错误,我该如何解决?错误; The method update(Integer, Inte
我有一个称为 client 的表,其中有一列称为created_time ,所以实际上我想绘制一个 map ,以便我可以知道在哪一年和哪一个月添加了多少客户?现在的要求是假设在 2018 年 11 月
这个问题已经有答案了: Is Java "pass-by-reference" or "pass-by-value"? (91 个回答) 已关闭 8 年前。 我对 ArrayList Collecti
我意识到下面的代码是正确的 Integer.MIN_VALUE == -Integer.MIN_VALUE == Math.abs(Integer.MIN_VALUE) 这是因为当我们取反-21474
我有以下类 AccountWebappGridRow,它扩展了 AccountGridRow: public class AccountWebappGridRow extends AccountGri
我正在学习 Haskell 并看到了函数组合。 尝试复合 map和 foldl mapd = (map.foldl) 比 test = (mapd (\x y -> x + y ) [1,2,3,4]
我有两个相同大小的数组和两个方法。 public class Client { private static int[] ints; private static final int
我喜欢 Java 8 中的 Streams 概念。现在我想借助 Java Streams 将 Java 中的 Map 转换为排序列表。我只想显示列表而不将其存储在任何地方。我希望在结果列表中有这个输出
我有一个数据库表,其中包含电视节目类型列表和关联的 ARGB 颜色值,用于在显示电视指南时突出显示 Android ListView 中的电视节目。流派表看起来像这样... id genre
我有一个 Integer 类,它应该模拟一个整数 mod n。因此,它具有如下构造函数: Integer::Integer(int x) : m(x), n(0) { } Integer::I
我是一名优秀的程序员,十分优秀!