ステートメントを文字列リテラルではなく文字列変数として渡すことにより、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ファイル全体を実行する方法が見つからなかったためです。私が見つけていないことをする簡単な方法があれば、それも私の問題を解決するでしょう。前もって感謝します。