【问题标题】:java.sql.SQLSyntaxErrorException-ORA-01722: invalid number - Prepared statementjava.sql.SQLSyntaxErrorException-ORA-01722:无效数字 - 准备好的语句
【发布时间】:2021-12-23 20:10:16
【问题描述】:

我正在通过删除代码中的 replaceAll() 来修复代码中的一些 SQL 注入问题。我用占位符替换查询中的命名参数,并在其中使用准备好的语句。我遇到以下问题,请指教。

查询:

<entry key= "GET DATA">
select ATYPE, ANAME, AGRID, AVALUE
from ALG_RSV.TERMS
--where AGRID in (':AGRS')  // changed this line
where AGRID in (?) // to this 
order by 2,1

代码:

 {...
    List<String> agreeIDs = getAgree
    String agrID = String.join(",",agreeIDs);
    // String sqlQuery = CSRConsole.getProperty(GET DATA).replaceAll(":AGRS", agrID);// 
    commented out replaceALL 

    String sqlQuery = CSRConsole.getProperty(GET DATA); //Changed like this
    prepStat= Conn.prepareStatement(sqlQuery);
    prepStat.setString(1, agrID);// changed like this, getting issue in this line
    rs = prepStat.executeQuery();
    .....}

错误:

java.sql.SQLSyntaxErrorException-ORA-01722:无效数字

有人可以帮我解决这个问题吗?这里有什么问题?如何将命名参数转换为占位符?

【问题讨论】:

    标签: java sql oracle prepared-statement placeholder


    【解决方案1】:

    我不确定您的问题的全部内容,但 Java PreparedStatement 语句 API 不使用命名占位符,它仅使用由 ? 指示的位置占位符。来自official documentation,这是一个示例代码:

    String updateString = "update COFFEES " + "set SALES = ? where COF_NAME = ?";
    PreparedStatement updateSales = con.prepareStatement(updateString);
    updateSales.setInt(1, e.getValue().intValue());
    updateSales.setString(2, e.getKey());
    updateSales.executeUpdate();
    

    【讨论】:

    • 是的..这就是为什么我将命名参数更改为,使用位置占位符?,并在其中使用preparedStatement。现在我遇到了这个问题
    • 编辑您的问题并显示您拥有的完整工作流程的数据。我不清楚(对我来说)你想在这里做什么。
    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2016-03-23
    • 2021-10-30
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2013-01-26
    相关资源
    最近更新 更多