В двух словах о проблеме:
Вот что происходит при попытке вставить строку с несколькими пустыми столбцами с помощью подготовленного оператора и groovy.sql.Sql:
groovy:000> val
===> [123123123, 2, null, 0, 0, , null, , 1213020112511801, 1283425009158952, 1, 2, null, 0, 0, , null, , 1213020112511801, 1283425009158952]
groovy:000> destSql.execute "insert into my_table values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", val
ERROR java.sql.SQLException: Type is not supported.
at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException (Unknown Source)
at org.apache.derby.client.am.SqlException.getSQLException (Unknown Source)
at org.apache.derby.client.am.PreparedStatement.setObject (Unknown Source)
at groovysh_evaluate.run (groovysh_evaluate:3)
...
groovy:000>
Я получаю аналогичный результат с destSql.dataSet("my_table").add valueMap.
Вот что происходит при попытке вставить ту же строку, что и GString:
groovy:000> destSql.execute "insert into my_table values (${val[0]}, ${val[1]}, ${val[2]}, ${val[3]}, ${val[4]}, ${val[5]}, ${val[6]}, ${val[7]}, ${val[8]}, ${val[9]})"
===> false
groovy:000>
Теперь я понимаю, что возникают проблемы со вставкой нулевых значений с использованием подготовленного оператора (как описано, например, здесь и здесь).
Я хотел бы понять следующее:
1) Мне трудно поверить, что вставка нулей с помощью подготовленных операторов невозможна, так почему это иногда вызывает проблемы? Менее совершенные драйверы JDBC, движки баз данных?
2) Почему работает пример с GString? Следуя той же логике, он по-прежнему не набирает информацию даже о нулевых столбцах, так как же это работает?