Пакетная вставка Snowflake JDB C завершается неудачно с сообщением «Привязать переменную? Не задана» при указании типа в запросе с помощью «? :: TIMESTAMP_NTZ» - PullRequest
0 голосов
/ 07 мая 2020

Мы используем драйвер JDB C для подключения к Snowflake и выполнения вставок. Таблица может иметь несколько столбцов временных меток, это означает, что один запрос вставки может иметь дело как с timestamp_ntz, так и с timestamp_ltz.

Он отлично работает, когда мы указываем тип в запросе при привязке значений, как показано ниже

INSERT INTO <TABLENAME> VALUES(?::TIMESTAMP_NTZ, ?::TIMETAMP_LTZ)

Однако, когда мы пробуем то же самое с addBatch () и executeBatch (), он терпит неудачу с «Bind variable? Not set»

Пример программы -

try (Connection con = getConnection()) {
    con.createStatement().execute("create or replace table Test_TSNTZ(t1 TIMESTAMPNTZ)");
    try (PreparedStatement ps = con.prepareStatement("insert into Test_TSNTZ values (? ::TIMESTAMP_NTZ)"))  {
        java.sql.Timestamp t = java.sql.Timestamp.valueOf("2019-09-23 10:10:10.0");
        for (int i = 0; i < 22; i++) {
            ps.setTimestamp(1, t);
            ps.addBatch();
        }
        ps.executeBatch();

        try (Statement statement = con.createStatement()) {
            try (ResultSet resultSet = statement.executeQuery("select * from Test_TSNTZ ")) {
                while (resultSet.next()) {
                    System.out.println(resultSet.getTimestamp(1));
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 07 мая 2020

Как я вижу, коннектор JDB C ( не уверен, что он указывает c на Snowflake ) не может связать переменные в пакете , если Переменная заключена в функцию или оператор приведения.

В качестве обходного пути вы можете отправить значения временной метки в виде строки. Snowflake преобразует его в тип столбца:

try (Connection con = getConnection()) {
    con.createStatement().execute("create or replace table Test_TSNTZ(t1 TIMESTAMP_NTZ, t2 TIMESTAMP_LTZ)");
    try (PreparedStatement ps = con.prepareStatement("insert into Test_TSNTZ values ( ?, ? )"))  {
        java.sql.Timestamp t = java.sql.Timestamp.valueOf("2019-09-23 10:10:10.0");
        for (int i = 0; i < 22; i++) {
            ps.setString(1, t.toString());
            ps.setString(2, t.toString());
            ps.addBatch();
        }
        ps.executeBatch();

        try (Statement statement = con.createStatement()) {
            try (ResultSet resultSet = statement.executeQuery("select * from Test_TSNTZ ")) {
                while (resultSet.next()) {
                    System.out.println(resultSet.getTimestamp(1) + "," + resultSet.getTimestamp(2) );
                }
            }
        }
    }
}
...