【问题标题】:Insert into SQL with Groovy using variable for values使用 Groovy 使用变量作为值插入 SQL
【发布时间】:2020-05-16 13:41:01
【问题描述】:

我正在尝试将变量用于插入 SQL 语句的值部分。奇怪的是,如果我复制我在调试器中看到的值,那么语句就会运行并正确插入。如果我使用该变量,那么它会给我一个 “抱歉,值的数量错误” 错误。

这是我的插入

db.execute("""
        INSERT INTO TABLE 
        (UNIT, ORD#, DISP, DATE, TIME, AMT, LAT, LONG, DRVR, OWNR, SETT, STAT) 
        values ${parsedOrderNumbers}
        """)

parsedOrderNumbers 看起来像在调试器中,但它也可能有 " " 围绕它,因为它是一个字符串。我不确定并认为这可能是这里发生的错误,或者可能是 Groovy 如何插值${parsedOrderNumbers}

('12345', '1234567', '' ,'2020-04-11', '234', '35.00', '39.693702697753906', '-75.53226470947266', '', '', '', ''), ('20514', '9876543', '' ,'2020-04-12', '004', '24.00', '39.27902603149414', '-76.55120086669922', '', '', '', '') 

如果我复制它并替换${parsedOrderNumbers},那么语句就会运行。有什么想法吗?

【问题讨论】:

  • 你在使用groovy.sql吗?
  • 您能否打印(调试)${parsedOrderNumbers} 的值并检查其中的内容,以及它与您的硬编码字符串有何不同
  • 当我在调试器中查看它时,它会在字符串的开头和结尾显示 "。这是我看到的唯一区别。像 "('12345'、'1234567' 等。 .)"
  • 是的,我正在使用 groovy.sql

标签: java sql groovy db2


【解决方案1】:

为JDBC参数化sql的正确方法是:

db.executeInsert("INSERT INTO TABLE MyTable VALUES (?, ?, ?)", ['some', 123, myVar])

文档:https://docs.groovy-lang.org/latest/html/documentation/sql-userguide.html#_creating_inserting_data

【讨论】:

  • 我会试试这个,看看会发生什么。
  • @Matt 发生了什么?
  • 如果我没记错的话,我导入的其中一个字段在创建新列的字符串中有一个 '。我仍然需要将其切换为使用更安全的准备好的语句。
【解决方案2】:

当您将${} 语法与 GString 版本的 execute() (Sql.execute(GString gstring)) 一起使用时, groovy-sql 会将每个 ${} 视为绑定变量。 您收到错误抱歉,值的数量错误,因为 groovy-sql 当您尝试插入 12 个值时,只看到一个绑定变量。

您所做的实际上不是最佳实践,既形成了安全性(SQL 注入) 和性能(数据库查询缓存)的角度。

如果您真的想预先生成 VALUES 子句,请使用字符串版本 Sql.execute(String query) 这样的。

db.execute("""
        INSERT INTO TABLE 
        (UNIT, ORD#, DISP, DATE, TIME, AMT, LAT, LONG, DRVR, OWNR, SETT, STAT) 
        values ${parsedOrderNumbers}
        """.toString())

但是,我建议按照@ou_ryperd 的建议或类似的方式进行操作。

db.execute("""
        INSERT INTO TABLE 
        (UNIT, ORD#, DISP, DATE, TIME, AMT, LAT, LONG, DRVR, OWNR, SETT, STAT) 
        values ($unit, $orderNo, $disp, $date, $time, $amt, $lat, $long, $drvr, $ownr, $sett, $stat)
        """)

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多