java.sql.SQLSyntaxErrorException:ORA-01722

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.sql.SQLSyntaxErrorException:ORA-01722相关的知识,希望对你有一定的参考价值。

我有以下JDBC代码:

public int addItem(String name, String price, String count, String isPR, String img) {
    int result = 0;
    try {
        String query = "INSERT INTO T001_ITEM"
                + "(ITEM_NO,ITEM_NM,UNIT_PRICE,STOCK_COUNT,RECORD_DATE,IS_PR,ITEM_IMAGE_FILE_PATH)"
                + "VALUES(TABLE_SEQ.NEXTVAL,'" + name + "','" + price + "','" + count + "', sysdate,'" + isPR
                + "','" + img + "')";

        pstmt = conn.prepareStatement(query);
        result = pstmt.executeUpdate();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

它抛出以下错误:

java.sql.SQLSyntaxErrorException:ORA-01722。

这是怎么造成的,我该如何解决?

答案

不要像使用'" + name + "'那样将值连接到查询中,为了避免SQL注入,我建议你使用带参数的预准备语句:

String query = "INSERT INTO T001_ITEM "
        + "(ITEM_NO, ITEM_NM, UNIT_PRICE, STOCK_COUNT, RECORD_DATE, IS_PR, ITEM_IMAGE_FILE_PATH) "
        + "VALUES(TABLE_SEQ.NEXTVAL, ?, ?, ?, sysdate, ?, ?)";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, name);
pstmt.setString(2, price);
pstmt.setString(3, count);
pstmt.setString(4, isPR);
pstmt.setString(5, img);

注意

确保表中属性的类型相同,将所有值设置为String。我不认为price可以是一个字符串或isPR似乎是一个Boolean而不是String,而count可以是一个数字而不是String所以仔细检查你的类型。

如果您无法更改方法之外的类型,那么您可以将其转换为正确的类型但是您应该测试它们,这可能会产生另一个问题。

所以举个例子

int countN = Integer.parseInt(count);

要么

pstmt.setInt(3, Integer.parseInt(count));

等等所有其他类型。

喜欢这个documentation says here

是什么导致这个错误?

尝试将字符串转换为数字时,会发生ORA-01722(“无效数字”)错误,并且该字符串无法转换为有效数字。有效数字包含数字'0'到'9',可能有一个小数点,字符串开头或结尾的符号(+或 - ),或'E'或'e'(如果它是浮点数)科学记数法中的点数)。禁止所有其他角色。

就像我之前说过的那样,检查表中的类型是否完全,你不能在Number的位置设置一个String

您可以了解有关此错误herehere的更多信息

另一答案

抱歉,我没有足够的声誉将此添加为评论,

ORA-01722:简单地表示它无法将String值转换为整数。

通过查看您可以理解的内容,您正在将价格和计数作为字符串传递给数据库,您可以查看数据库中字段的声明是什么。您需要将它们转换为int,然后您可以尝试插入。

以上是关于java.sql.SQLSyntaxErrorException:ORA-01722的主要内容,如果未能解决你的问题,请参考以下文章