java - SQLException : fetched column value was truncated when executing while (rs. getNext())

标签 java sql database oracle

我有一个程序可以使用相当简单的查询从 Oracle 10g (10.2.0.3) 中提取大型数据集。您几乎可以将查询/逻辑称为某种“导出”,因为它从具有最小 where 子句的表中选择列(即,它返回大部分(如果不是全部)行)。

[Java] 代码是我们都见过的样板:

Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
    con = getConnection(Person);
    pstmt = con.prepareStatement(
            "SELECT ID, FIRST_NAME, LAST_NAME, ... FROM PERSON WHERE ...");
    rs = pstmt.executeQuery();
    while (rs.next()) {
        // write the data to a file
    }
}
finally {
    if (rs != null) try { rs.close(); } catch (Exception e) { }
    if (pstmt != null) try {pstmt.close(); } catch (Exception e) { }
    if (con != null) try { con.close() ; } catch (Exception e) { }
}

getConnection 是我自己的方法,它将连接对象返回到用于“PERSON”表的 Oracle 数据库。这感觉像是一个普通的编程问题,但我已经多次编写过这样的代码,但从未遇到过这个问题。

我收到 java.sql.SQLException: ORA-01406: 提取的列值在 while (rs.next()) 行被截断。我读过的 Oracle 文档说“FETCH 操作被强制截断字符串”。它建议使用更大的列缓冲区来容纳最大的列。但这没有意义。在上面代码中被注释为“将数据写入文件”的部分中,我只是简单地将每一列写为 rs.getBigDecimal("ID")、rs.getString("FIRST_NAME", 等。事实上,我可以,使用不对 ResultSet 执行任何操作的空 while 循环重现该区域。也就是说,仅遍历 ResultSet 会导致抛出 SQLException。

返回的数据集的大小应约为 100 万行。在循环中大约 600,000 行/迭代后,我得到了异常。有什么想法吗?

最佳答案

PERSON 是表还是 View ?

在某些时候,在幕后,Java 必须计算出数据的数据长度。我猜它做错了。首先,逐一删除列,以便您可以确定哪一列出了问题。然后可能会以 block (例如 1-100000、100001-200000 等)的形式遍历数据,以找到导致错误的 block 。然后缩小块(100000-150000 等),直到找到导致问题的单行。通过查看该行,很明显问题出在哪里。如果不是,请尝试使用 DUMP 功能查看数据中的字节。

数字列中的数据可能与列定义不对应。这通常是一个错误,可能是磁盘损坏,有时是通过 OCI 创建的奇怪数据。你可以尝试做一个

SELECT COUNT(*) FROM PERSON WHERE ID != TRUNC(ID); 

如果您的数据库使用多字节字符集,则可能会混淆字符串。此外,如果字符串中有非常规字符(例如 ASCII 0-31)

关于java - SQLException : fetched column value was truncated when executing while (rs. getNext()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456532/

相关文章:

java - FEST:启动/停止使用 System.exit() 而不影响 VM 的外部 SWING 程序

java - 将图标添加到菜单项

java - XML 文件位于内存中,而不是作为磁盘上的文件

mysql - 分组连接以包含相应的数据

sql - 了解 Sql Server 查询 - ORDER BY 子句中的 CASE

java - 我试图在 java 中的 sqlite 嵌入式数据库中插入一行。插入后,更改仅在该程序中可见

java - 为什么我的 Go 数组排序代码比 Java 慢很多?

sql - T-SQL 到 "Merge"两行,或 "Rekey"所有 FK 关系

Cassandra 每个节点设置多个磁盘

java - 获取 SQLite 单列结果列表的快速方法