Groovy Sql.execute() с оператором sql в качестве строковой переменной не работает
Я пытаюсь выполнить SQL-оператор в Groovy, передавая оператор как строковую переменную, а не строковый литерал. Причина, по которой я использую строковую переменную, заключается в том, что я читаю оператор 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 из файла, заключается в том, что я не смог найти способ выполнить весь файл.sql с помощью groovy. Если есть простой способ сделать то, чего я не нашел, это также решило бы мою проблему. Заранее спасибо.
2 ответа
Выяснили причину: у меня был открыт SQL Developer, связанный с теми же учетными данными, которые я использовал в своем скрипте groovy. Я выполнил несколько команд в SQL Developer и не принял их, что вызвало конфликт при запуске скрипта groovy. Это было причиной остановки. Как только я зафиксировал изменения, сделанные в SQL Developer, скрипт работал нормально.
Ну, это хорошо работает с 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)
Вы уверены, что ничего не делаете для str
прежде чем передать его sql.execute
? Можете ли вы убедиться, что он не каким-то образом обернут в специализированный классный класс, такой как GStringImpl
?