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 文件的方法。如果有一种简单的方法可以做我还没有找到的事情,那也可以解决我的问题。提前致谢。

4

2 回答 2

3

找出原因:我打开了 SQL Developer,并使用了我在我的 groovy 脚本中使用的相同凭据。我在 SQL Developer 中执行了一些命令而忽略了提交它们,这在运行 groovy 脚本时导致了冲突。这就是停滞不前的原因。一旦我提交了在 SQL Developer 中所做的更改,脚本就运行良好。

于 2013-03-30T22:15:29.497 回答
0

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

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

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

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

关于你的最后一个例子:

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

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

我想不出任何东西的唯一例子是:

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

你确定你str在传递给之前没有做任何事情sql.execute吗?你能确保它不会以某种方式被包裹在一个专门的 groovy 类中GStringImpl吗?

于 2013-03-22T10:11:12.197 回答