在SQL查询中使用Groovy字符串变量

t9aqgxwy  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(287)

我正在尝试运行一个SQL查询,其中的变量在脚本中的其他地方定义。当查询运行数据库时,它只使用值?,而不是脚本中前面定义为字符串的预期值。
我大概是这样想的:

def quickFilterQuery = """
                       SELECT "NAME","QUERY","RAPID_VIEW_ID" from "AO_60DB71_QUICKFILTER" WHERE "QUERY" like '%${CUSTOM_FIELD_NAME}%';
                       """
 log.warn "QF results: $quickFilterQuery"     

...
try {
    StringBuffer slr = new StringBuffer()
    sql.eachRow(quickFilterQuery) { it ->

结果是:

WARN [runner.ScriptBindingsManager]: QF results: 
                       SELECT "NAME","QUERY","RAPID_VIEW_ID" from "AO_60DB71_QUICKFILTER" WHERE "QUERY" like '%Ontology%';

WARN [sql.Sql]: Found 0 parameter placeholders but supplied with 1 parameters
WARN [sql.Sql]: Failed to execute: 
                       SELECT "NAME","QUERY","RAPID_VIEW_ID" from "AO_60DB71_QUICKFILTER" WHERE "QUERY" like '%?%';

日志记录正确捕获了变量 * 应该 * 是什么,但查询错误似乎没有正确使用变量。
当我没有使用变量(只是字符串)时,查询就像预期的那样工作。我假设我的格式设置是关闭的,但是我一辈子都找不到问题所在。

8wigbo56

8wigbo561#

第1版
在执行quickFilterQuery之前将其转换为字符串。此方法存在SQL注入问题-如果CUSTOM_FIELD_NAME包含引号'字符,则此方法将不起作用

def CUSTOM_FIELD_NAME = "Ontology"
def quickFilterQuery = """
                       SELECT "NAME","QUERY","RAPID_VIEW_ID" from "AO_60DB71_QUICKFILTER" WHERE "QUERY" like '%${CUSTOM_FIELD_NAME}%';
                       """ as String
sql.eachRow(quickFilterQuery){...}

第二版
一个更好的方法保持quickFilterQuery作为GSteing -所以,准备好的语句(带?)用于执行和传递查询参数。
您必须删除${CUSTOM_FIELD_NAME}前后的引号

def CUSTOM_FIELD_NAME = "%Ontology%"
def quickFilterQuery = """
                       SELECT "NAME","QUERY","RAPID_VIEW_ID" from "AO_60DB71_QUICKFILTER" WHERE "QUERY" like ${CUSTOM_FIELD_NAME};
                       """
sql.eachRow(quickFilterQuery){...}

相关问题