java.sql.SQLSyntaxErrorException:ORA-01722

时间:2017-01-30 06:19:39

标签: java oracle jdbc

我有以下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。

这是如何引起的?如何解决?

2 个答案:

答案 0 :(得分:1)

不要像现在使用'" + 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

的位置设置一个字符串

您可以详细了解此错误herehere

答案 1 :(得分:0)

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

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

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