Как передать параметр типа image в udf-функцию базы данных H2?

В среде spring вызывается udf-функция imageinsert, которой нужно передать изображение для вставки в таблицу БД H2. функция создаётся, в соответствии с документацией, с помощью скрипта:

CREATE ALIAS imageinsert AS $$
void imageinsert(java.sql.Connection conn,
Integer idimage, String nameimage, Integer sizeimage, byte[] dataimage) throws SQLException {
String sql = "insert into images (idimage, nameimage, sizeimage, dataimage) values(" + idimage + ",'" + nameimage + "'," + sizeimage + "," + dataimage + ")";
conn.createStatement().executeUpdate(sql);
}
$$;

Естественно, при формировании строки sql возникает ошибка. Если устранить данные о двоичном параметре:

CREATE ALIAS imageinsert AS $$
void imageinsert(java.sql.Connection conn,
Integer idimage, String nameimage, Integer sizeimage) throws SQLException {
String sql = "insert into images (idimage, nameimage, sizeimage) values(" + idimage + ",'" + nameimage + "'," + sizeimage + ")";
conn.createStatement().executeUpdate(sql);
}
$$;

то функция вызывается верно.

как правильно передать параметр типа image в udf-функцию базы данных H2 ?


Ответы (1 шт):

Автор решения: Карабас

вот работающий код:

CREATE ALIAS imageinsert AS $$
ResultSet imageinsert(java.sql.Connection conn, String nameimage, String descriptimage, Integer sizeimage, byte[] dataimage) throws SQLException {
    Integer lastvalue = 0;
    java.sql.ResultSet rs = null;

    String sql = "select images_sequence.nextval";
    rs = conn.createStatement().executeQuery(sql);
    while(rs.next()) { lastvalue = rs.getInt(1); }

    sql = "insert into images (idimage, nameimage, descriptimage, sizeimage, dataimage)" +
    " values( ?, ?, ?, ?, ?)";
    java.sql.PreparedStatement pstat = conn.prepareStatement(sql);
    pstat.setInt(1, lastvalue);
    pstat.setString(2, nameimage);
    pstat.setString(3, descriptimage);
    pstat.setInt(4, sizeimage);
    pstat.setBytes(5, dataimage);
    
    pstat.executeUpdate();
    pstat.clearParameters();

    sql = "select idimage, nameimage, descriptimage, sizeimage, dataimage" +
    " from images where idimage = " + lastvalue;
    return conn.createStatement().executeQuery(sql);
}
$$;

особенность выполнения в том, что нужно использовать:

  • java.sql.PreparedStatement;
  • pstat.executeUpdate();

код возвращает новое значение записи таблицы:

введите сюда описание изображения

→ Ссылка