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?

Другие вопросы по тегам