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

理由を理解しました。Groovyスクリプトで使用していたのと同じクレデンシャルでSQLDeveloperを開いて接続しました。SQL Developerでいくつかのコマンドを実行し、それらをコミットすることを怠ったため、Groovyスクリプトの実行時に競合が発生しました。これがストールの原因でした。SQL Developerで行った変更をコミットするとすぐに、スクリプトは正常に実行されました。

于 2013-03-30T22:15:29.497 に答える
0

これはmySqlで正常に機能するので、OracleJDBCドライバーの問題だと思います。私自身はそれを使った経験はありませんが、それがあなたが見つけることができる最も信頼できるソフトウェアではないことを理解しています。

これは暗闇の中でのちょっとしたショットですが、:

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

これらの呼び出しの両方で、渡される値sql.executeは実際にはではなくStringGStringImpl問題に関係している可能性があります。

最後の例について:

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 に答える