【问题标题】:Java PreparedStatement use issueJava PreparedStatement 使用问题
【发布时间】:2018-12-21 12:05:01
【问题描述】:

我有一个问题,我多次尝试尽可能多地解决,但无法解决。

我有一个表X 具有以下结构(由于列删除和创建):

A  String
B  Int
D  Int
C  Boolean
G  Boolean
E  Int
F  Boolean

我正在准备一个preparedStatement来尝试将数据插入到上面的列中

for (I=0 ; I < 5 ; I++) {
    pS = INSERT IN X (A, B, D, C, E ) Values (?,?,?,?,?);
    //Observer the query.

    pS.SetString (1,a);
    pS.SetString (2,100);
    pS.SetString (3,100);
    pS.SetString (4,0);
    pS.SetString (5,200);

    ps.AddBatch();
}
ps.executeBatch();

但是我得到一个错误

java.sql.BatchUpdateException: ORA-12899: 列“G”的值太大(实际:3,最大值:1)

即使我不想根据查询在 G 列中输入任何内容,为什么它会尝试插入 G 列。

【问题讨论】:

  • 可以为布尔字段设置默认o
  • 发布表的 DDL(create table 语句)。 BOOLEAN 不是有效的 Oracle 类型。可能的解释,你有一个VARCHAR2(1)column 和一个试图插入'YES' 的触发器;)
  • 列 G 可以为空吗?
  • 是的 G 列可以为空。该列也是 VARCHAR2(1 CHAR)
  • 问题不在于列我看到的问题是虽然我的查询没有引用 G 列但因为 G 列是第 5 列和 pS.SetString (5,200);正在尝试插入第 5 列????这是我的假设。

标签: java sql oracle prepared-statement


【解决方案1】:

G 未插入,在您的代码中;在 DDL 中应该有一个默认值。 对于布尔值,使用 setBoolean 或 setInt。

// Column G  Boolean DEFAULT '0'

try (PreparedStatement pS = con.prepareStatement(
        "INSERT IN X (A, B, D, C, E) Values (?, ?, ?, ?, ?)")) {
    for (int I = 0; I < 5; I++) {
        pS.SetString(1, a);
        pS.SetInt(2, 100);
        pS.SetInt(3, 100);
        pS.SetBoolean(4, false);
        pS.SetInt(5, 200);

        pS.AddBatch();
    }
    pS.executeBatch();
}

【讨论】:

  • 即使采用上述设置,错误仍然相同。正如我之前解释的那样,我所看到的 pS.SetInt(5, 200) 在此语句中的 5 表示表中的第 5 列。这是否意味着查询的第 5 个元素?
  • 第五个?,E,是INT(3 or more),而不是布尔值INT(1)。也许错误源于 200 有 3 位数。
  • 而 A、B、D、C、E 是定义的列名(G 可疑缺失)。
【解决方案2】:

我认为您可以使用所有表格键并简单地设置您想要的值

好像它有五个元素,现在你有七个你使用一组七个元素

for (I=0 ; I < 5 ; I++) {
    pS = INSERT IN X (A, B, C,D, E,F,G ) Values (?,?,?,?,?,?,?);
    //Observer the query.

    pS.SetString (1,a);
    pS.SetString (2,100);
    pS.SetString (3,100);
    pS.SetString (4,0);
    pS.SetString (5,200);
    pS.SetString (6,200);
    pS.SetString (7,200);

    ps.AddBatch();
}
ps.executeBatch();

【讨论】:

  • 我可能不想根据某些条件在某些列中插入数据。因此,在所有列中添加数据是不明智的。这就是为什么这些列可以为空。
  • 您可以使用 setString 来为您希望为空的值设置空
  • 我的问题不是将字符串设置为 NULL 或问题是插入此数据的顺序。 PreparedStatement 是否期望我必须将数据插入到所有列中作为 AddBatch 的一部分?或者我可以跳过列
猜你喜欢
  • 1970-01-01
  • 2013-06-12
  • 2011-06-28
  • 2011-04-19
  • 2011-01-31
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多