首页 文章

Groovy Sql.execute()与sql语句作为字符串变量不起作用

提问于
浏览
1

我试图通过将语句作为字符串变量而不是字符串文字传递来在groovy中执行sql语句 . 我使用字符串变量的原因是因为我正在从文件中读取sql语句 .

例如(假设sql是groovy.sql.Sql的有效实例 - 我已经验证过):

sql.execute("insert into table(id) values(1)")

工作得很好 .

但是,以下内容不是:

def str = "insert into table(id) values(1)"
sql.execute(str)

最后一个例子在我运行时挂起 . 没有SQL错误,它只是停滞不前 . 我尝试在执行后放入println,它永远不会到达println语句 .

所以,我尝试了以下变化:

sql.execute("$str")

sql.execute("${str}")

乃至

sql.execute("?", [str])

为了好奇,但所有人都给出了以下错误:

Mar 21, 2013 6:28:16 PM groovy.sql.Sql execute
WARNING: Failed to execute: ? because: Invalid SQL type: sqlKind = 0
Caught: java.sql.SQLException: Invalid SQL type: sqlKind = 0
java.sql.SQLException: Invalid SQL type: sqlKind = 0
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:77)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1010)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
        at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3677)
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
        at runSqlFile.run(runSqlFile.groovy:40)

我确实是groovy的新手,但我无法弄清楚为什么字符串文字有效,但变量不会 . 这里的任何帮助将不胜感激 . 如果需要更多信息,请与我们联系 .

另外,我从文件中获取单个sql语句的原因是因为我找不到使用groovy执行整个.sql文件的方法 . 如果有一种简单的方法可以做到我没有找到的,那也可以解决我的问题 . 提前致谢 .

2 回答

  • 2

    弄清楚原因:我让SQL Developer打开了与我在groovy脚本中使用的相同凭据连接 . 我在SQL Developer中执行了一些命令而忽略了提交它们,这在运行groovy脚本时引发了冲突 . 这是拖延的原因 . 一旦我提交了SQL Developer中的更改,脚本运行正常 .

  • 0

    嗯,这适用于mySql,所以我的猜测是这是Oracle JDBC驱动程序的一个问题 . 我自己没有经验,但我知道它不是你能找到的最可靠的软件 .

    这在黑暗中有点像,但是:

    sql.execute("$str")
    sql.execute("${str}")
    

    在这两个调用中,传递给 sql.execute 的值实际上不是 String 而是 GStringImpl ,这可能与您的问题有关 .

    关于你的上一个例子:

    sql.execute("?", [str])
    

    这只是无效的 . ? 将被解释为值,而不是SQL语句 . 你正在做的是传递一个字符串,它恰好包含有效的sql . 如果它包含 "foobar" 的结果将是相同的 .

    我无法想出任何事情的唯一例子是:

    def str = "insert into table(id) values(1)"
    sql.execute(str)
    

    你确定在传递给 sql.execute 之前你没有做任何事情吗? str ?你可以确定它不会以某种方式被包装在专门的groovy类中,例如 GStringImpl 吗?

相关问题