#java #oracle #jdbc
#java #Oracle #jdbc
Вопрос:
Пытаюсь записать условие, при котором ind равен null в запросе select на java, используя драйвер jdbc oracle.
код :
Выполнено все подключение к БД
info.add("CN");
info.add("NULL");
Пробовал:
ResultSet rs1 = st.executeQuery("select COUNT(*) from TABLENAME where A='" info.get(i) " and ind is'" info.get(i 1) " '");
Примечание: использование JDBC API драйвера oracle.
Берем нулевое значение из списка массивов. но оно не извлекает правильные значения из базы данных.
код:
Выполнено все подключение к БД
info.add("CN");
info.add("NULL");
ResultSet rs1 = st.executeQuery("select COUNT(*) from TABLENAME where A='" info.get(i) " and ind IS '" info.get(i 1) " '");
Я ожидаю, что результат будет таким, как count (количество строк):
Базовый sql-запрос, если используется в DB:
select COUNT(*)
from TABLENAME
where A= 'a'
and ind IS null;
Комментарии:
1. что такое тип данных info
2. Не объединяйте подобные значения в строку SQL. Научитесь правильно использовать
PreparedStatement
Ответ №1:
Первая обработка NULL отличается от обработки значения:
ind IS NULL
ind = '...'
Это затрудняет использование подготовленного оператора. Но PreparedStatement следует использовать не только для обеспечения безопасности (против SQL-инъекции), но и для экранирования одинарных кавычек и тому подобного. И безопасен для типов в том смысле, что использует типы и преобразования.
У Oracle SQL есть дефект, заключающийся в том, что он не различает NULL и «, поэтому вместо этого вы могли бы использовать «. Oracle независимый был бы:
// Typed fields:
String a = ...;
int n = ...;
String ind = null;
String sql = ind == null
? "select COUNT(*) from TABLENAME where A=? and n=? and ind is null"
: "select COUNT(*) from TABLENAME where A=? and n=? ind = ?";
try (PreparedStatement stmt = new PreparedStatement(sql)) {
stmt.setString(1, a);
stmt.setInt(2, n);
if (ind != null) {
stmt.setString(3, ind);
}
try (ResultSet rs = stmt.executeQuery()) {
long count = rs.next() ? rs.getLong(1) : 0L;
return count;
}
}
Оператор Try-with-resources закрывает и результирующий набор, также с выданным исключением или возвратом в середине.
Для общего списка объектов можно использовать один для цикла построения шаблона SQL, а второй для настройки полей PreparedStatement.
Ответ №2:
Эта часть:
" and ind is'" info.get(i 1) " '");
генерирует следующий SQL:
and ind is 'NULL ';
что неправильно, потому что это выдаст ошибку:
ORA-00908: отсутствует ключевое слово NULL
Вам нужно изменить это на:
" and ind is " info.get(i 1));
но тогда это больше не будет работать для ненулевых значений.