? не заменяется значениями внутри $$ - PullRequest
0 голосов
/ 07 мая 2018

У меня есть процедура, в которой я хочу передать точные значения из jdbc, которые передаются от пользователя после формата запроса.

но когда я использую подготовленное состояние с $$, выдает ошибку:

org.postgresql.util.PSQLException: The column index is out of range: 3, number of columns: 2.

однако без $$ все работает отлично. Пожалуйста, помогите мне, как передать аргумент с $$ с preparestatement?

conn = DriverManager.getConnection(jdbcUrl, username, password);
String prepareselectSQL="SELECT get_sum(?,?,$$?$$)";
stmt=conn.prepareStatement(prepareselectSQL);
stmt.setInt(1,10);
stmt.setInt(2,200);
stmt.setString(3,"");
rs = stmt.executeQuery();
while (rs.next()) {
      System.out.println(rs.getString(1));
}

см. Мой пример запроса:

select  * from getdashboarddata_010('application','(upload + download)',?,'2018-02-05 00:00:00','2018-02-05 00:00:00','0','5-1','','hits','desc','','true');

ниже значение, которое нужно заменить на? :

(select * ,  ''::text as srczonename, ''::text as srczonetype, ''::text as firewall_cat_type, ''::text as destzonename, ''::text as destzonetype ,  null::int as appresolver from fwapp_applicationutfv5_12hr ) fwapp_applicationutfv5_12hr where "5mintime" >='2018-05-04 00:00:00' and "5mintime" < '2018-05-04 23:59:59'

Итак, вы можете видеть, что мое значение уже содержит одинарные кавычки, по этой причине мне нужно передать это с использованием кавычек в долларах в отчете о подготовке.

1 Ответ

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

Я думаю, что вы пытаетесь использовать строковый литерал «кавычка в долларах» и подставлять параметр в строку. Вы не можете сделать это ? внутри строкового литерала SQL. Внутри строкового литерала SQL символ доллара не распознается как заполнитель параметра. (Это просто обычный буквенный символ доллара ... в строке.)

Если вам нужно сделать что-то, что влечет за собой сборку строкового значения, вам следует выполнить сборку в Java. Примерно так:

String sql = "SELECT get_sum(?, ?, ?)";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, 10);
stmt.setInt(2, 200);
stmt.setString(3, "'" + someString + "'");

Выше будет передано строковое значение, которое начинается и заканчивается символом ' в хранимой процедуре SQL get_sum.

...