Я конвертирую приложение Java из PostGresSQL в Derby (10.10.1.1). В базе данных PG есть много процедур, которые в идеале будут переданы процедурам Derby.
Одна из хранимых процедур PG передает массив временных меток, подобный этой процедуре/SQL:
CREATE FUNCTION getDownloads(_download_array timestamp without time zone[])
LANGUAGE plpgsql AS $$
DECLARE mycurs refcursor;
BEGIN
SELECT * FROM download_time d
WHERE d.downloadtime = ANY(_download_array);
END
RETURN mycurs;
Процедуры Derby — это в основном объявления, которые ссылаются на ваш класс процедур, содержащий общедоступные статические методы Java. Методы обычно используют объект PreparedStatement java.SQL и могут содержать динамические параметры. Процедура вызывается через объект java.SQL CallableStatement с заданными значениями параметров, который выполняется для возврата ResultSet.
Я хотел бы перевести приведенную выше процедуру PG в процедуру Derby, которая принимает несколько значений Timestamp, возможно, используя операторы ANY или IN. При ограниченном поиске оказывается, что Derby не поддерживает массивы в качестве динамических параметров< /а>.
При использовании клиента Squirrel SQL этот синтаксис оказывается приемлемым:
SELECT * FROM download_time d
WHERE d.downloadtime
IN('2011-11-13 13:24:00.0', '2011-11-13 13:28:00.0', '2014-05-06 07:08:09.0')
Однако на практике передача временных меток с разделителями-запятыми в операторы IN или ANY не работает, псевдокод ниже:
try {
Connection conn = getConnection();
CallableStatement cstmt = null;
cstmt = conn.prepareCall("{ call getDownloads(?) }");
cstmt.setTimestamp(3, "'2011-11-13 13:24:00.0', '2011-11-13 13:28:00.0'");
//Also tried this:
cstmt.setString(3, "2011-11-13 13:24:00.0, 2011-11-13 13:28:00.0");
cstmt.execute();
rs = cstmt.getResultSet();
while (null != rs && rs.next()) {
...
}
} catch (SQLException sqle) {
...handle errors
}
После приведенных выше примеров возникает эта ошибка:
java.sql.SQLException:
неверный синтаксис строкового представления значения даты/времени.
Я ищу альтернативные методы и рассматриваю решения, которые я нашел в отличной статье о StackOverflow, Альтернативы предложению PreparedStatement IN? Я хотел бы рассмотреть простое написание динамического SQL вместо параметризованной процедуры, но реальный запрос довольно ужасен. :)
PreparedStatement#setArray
- person Luiggi Mendoza   schedule 07.03.2014