【问题标题】:passing null to bind parameters in Groovy在 Groovy 中将 null 传递给绑定参数
【发布时间】:2020-04-03 08:51:52
【问题描述】:

我正在尝试编写一个小型 groovy 脚本,它从 csv 文件读取数据、评估数据并将数据写入 SQL DB。

从 csv 行读取的一些数据可以为空 - 在这种情况下,插入应该将 NULL 传递给数据库。出于性能和安全原因,我在 eachWithIndex 迭代之前构建了一个 sqlQuery 并在迭代中填充参数。

    def sqlQuery="""INSERT INTO database (
                    [Id],
                    [document],
                    [extension], 
                    [token]
                    ) VALUES (?, ?, ?, NULL)"""

jobList.eachWithIndex{ it, i ->
      eIDenter = it[0]
      eDoc = it[1] 
      eExt = it[2]
      sqlParams = [eID, eDoc, eExt]
      ...
}

虽然我可以简单地将 NULL 值传递给迭代中的列,但这些列始终为空(因为它们在 csv 文件中不存在),但我不确定这对于 groovy 中的绑定参数是如何工作的。 如果 csv 文件中不存在数据,则可以填充变量“eExt”或为空。

如何确保绑定参数显式在数据库为空时将 NULL 传递给数据库?

【问题讨论】:

    标签: sql groovy


    【解决方案1】:

    您可以使用Elvis-运算符:

    jobList.eachWithIndex{ it, i ->
       ....   
       eExt = it[2] ?: 'NULL'
       // or
       eExt = it[2] ?: null
       ....
    }
    

    【讨论】:

    • 当我将值“NULL”分配给 eExt 时,Word NULL 作为文字 / varchar 被放入数据库中。当我将 null 分配给 eExt 时,groovy 脚本中的变量为 null,并且在执行 sql 语句时该列被忽略。这意味着数据库中没有放入真正的 NULL 值 - 该列保持为空。
    • empty 是什么意思?它要么是null,要么是不可为空的异常
    • 我认为最好在脚本完成后通过数据库上的 SELECT 来解释:SELECT * FROM database where extension IS NULL -> 返回 0 行。 SELECT * FROM database where extension = 'NULL' -> 返回 200 行,SELECT * FROM database where extension = ''(2 个单引号)也是如此 - 这意味着取决于我使用 elvis 运算符的哪一行,该列是“ NULL”作为 varchar 或“空”('')。我直接在 VALUE 部分(不是通过绑定参数)中传递 NULL 的列 [token] 是 NULL 并且是可选择的(SELECT * FROM database WHERE token IS NULL)
    • 您使用的是什么 SQL API? groovy.sql 还是别的什么?
    • SQL API 是所用 DMS (d.velop/d.3) 的专有类/对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多