以Sql语句作为字符串变量的Groovy Sql.execute()无效

以Sql语句作为字符串变量的Groovy Sql.execute()无效,groovy,groovy-sql,Groovy,Groovy Sql,我试图在groovy中执行sql语句,方法是将语句作为字符串变量而不是字符串文本传递。我之所以使用字符串变量,是因为我正在从文件中读取sql语句 例如(假设sql是groovy.sql.sql的有效实例,我已经验证过): 很好用 但是,以下情况并非如此: def str = "insert into table(id) values(1)" sql.execute(str) 最后一个示例在运行时挂起。没有SQL错误,它只是暂停。我试着在execute之后放一个println,但它从未到达pri

我试图在groovy中执行sql语句,方法是将语句作为字符串变量而不是字符串文本传递。我之所以使用字符串变量,是因为我正在从文件中读取sql语句

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

很好用

但是,以下情况并非如此:

def str = "insert into table(id) values(1)"
sql.execute(str)
最后一个示例在运行时挂起。没有SQL错误,它只是暂停。我试着在execute之后放一个println,但它从未到达println语句

因此,我尝试了以下变化:

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文件的方法。如果有一个我没有找到的简单方法,也可以解决我的问题。提前感谢。

好吧,这在mySql上运行良好,所以我猜这是Oracle JDBC驱动程序的问题。我自己没有这方面的经验,但我知道这不是你能找到的最可靠的软件

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

sql.execute("$str")
sql.execute("${str}")
在这两个调用中,传递给
sql.execute
的值实际上不是
字符串,而是
GStringImpl
,这可能与您的问题有关

关于您的最后一个示例:

sql.execute("?", [str])
这是无效的<代码>?
将被解释为值,而不是SQL语句。您要做的是传递一个字符串,该字符串恰好包含有效的sql。如果它包含
“foobar”
,结果将是相同的

我想不出的唯一例子是:

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

在将
str
传递给
sql.execute之前,您确定没有对其执行任何操作吗?您能否确保它不会以某种方式被包装在一个专门的groovy类中,例如
GStringImpl

找到了原因:我让SQL Developer open连接了我在groovy脚本中使用的相同凭据。我在sqldeveloper中执行了一些命令,但忽略了提交它们,这在运行groovy脚本时导致了冲突。这就是拖延的原因。我一提交在SQL Developer中所做的更改,脚本就运行良好。

SQL.execute($str”)将无法工作,但SQL.execute(str)或SQL.execute($str.toString())应该可以工作。我刚试过。@Kunal+1这很奇怪。刚刚用sql.execute(str)再次尝试了它,因为您提到它应该可以工作,并且还尝试了sql.execute(“$str.toString()”)。现在两个都可以工作了。我不知道为什么前者不能更早地工作。不过谢谢你的提示!找出原因:我让SQL Developer open使用与我在groovy脚本中使用的相同凭据进行连接。我相信这就是拖延的原因。我一关闭SQLDeveloper,脚本就运行良好。谢谢大家的帮助。谢谢你们的回复。我忘了提到,我还尝试了
sql.execute(str.toString())
(和
.toString()
以及所有其他尝试),以确保它不会遇到
GStringImpl
问题,但没有效果。而且在
def str=“…”
sql.execute(str)
之间没有其他代码行,所以这不是问题所在。这不是由sql developer的连接引起的,更可能是因为sql developer中有未提交的事务阻止groovy脚本提交。是的,谢谢你的澄清,事实就是这样。相应地更新了答案。
sql.execute("?", [str])
def str = "insert into table(id) values(1)"
sql.execute(str)