You need to enable JavaScript to run this app. Groovy SQL动态插入数据无报错但未生效问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Groovy SQL动态插入数据无报错但未生效问题求助

问题根因

你遇到的核心问题是预编译SQL的参数列表写法错误:
connection.execute Mytable, [${SYS_idValue}]
这里的${}是Groovy GString专属的插值语法,仅在双引号/三双引号包裹的字符串场景下生效,直接写在List字面量中属于非法用法,实际传入参数不是你预期的'9999999',但因为SQL本身语法合法,所以不会抛出异常,最终导致没有数据写入。
另外还有一个潜在问题:JDBC连接可能默认关闭了自动提交,插入操作执行后未手动提交事务,直接关闭连接会导致插入被回滚。

修正代码

def SYS_idValue = '9999999'
def connection = null
try {
    // 建立数据库连接
    connection = Sql.newInstance(CCMJdbcUrl, CCMUsername, CCMPassword, CCMJdbcDriver)
    // 开启自动提交,或执行完插入后手动调用 connection.commit()
    connection.connection.autoCommit = true

    def insertSql = 'INSERT INTO INTELTABLE (SYS_ID) VALUES (?)'
    // 参数列表直接传入变量,不需要${}包裹
    connection.execute insertSql, [SYS_idValue]
} catch (Exception e) {
    println("Exception" + e)
    // 异常时回滚事务
    if (connection) {
        connection.rollback()
    }
} finally {
    // 资源关闭统一放finally块,避免异常场景下连接泄漏
    if (connection) {
        connection.close()
    }
}

可选写法

Groovy SQL原生支持GString插值自动转预编译参数,你也可以用更简洁的写法,效果和占位符写法完全一致,还能避免SQL注入风险:

def SYS_idValue = '9999999'
def connection = null
try {
    connection = Sql.newInstance(CCMJdbcUrl, CCMUsername, CCMPassword, CCMJdbcDriver)
    connection.connection.autoCommit = true
    // 直接用GString插值,Groovy SQL会自动处理为预编译语句
    connection.execute "INSERT INTO INTELTABLE (SYS_ID) VALUES (${SYS_idValue})"
} catch (Exception e) {
    println("Exception" + e)
    if (connection) connection.rollback()
} finally {
    if (connection) connection.close()
}

内容的提问来源于stack exchange,提问作者Fabio Ochoa Restrepo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 22:15:01