2010-11-22 2 views
14
  1. В соответствии с java-документами PreparedStatement.setNull: «Примечание: вы должны указать тип SQL-кода параметра». В чем причина, по которой метод требует тип SQL столбца?Почему для PreparedStatement.setNull требуется sqlType?

  2. Я заметил, что передача java.sql.Types.VARCHAR также работает для столбцов без varchar. Существуют ли сценарии, в которых VARCHAR не подходит (некоторые типы столбцов или некоторые поставщики БД)?

Спасибо.

ответ

10

Согласно ява Документов PreparedStatement.setNull: «Примечание: необходимо указать параметра SQL типа». В чем причина, почему метод требует типа SQL столбца ?

Для максимальной совместимости; согласно спецификации, есть некоторые базы данных, которые не позволяют отправлять НТИЛ в исходный источник данных.

Я заметил, что передача java.sql.Types.VARCHAR также работает для без VARCHAR столбцов. Существуют ли сценарии , в которых VARCHAR не будет подходит (некоторые типы столбцов или некоторых поставщиков БД)?

Я не думаю, что такое поведение действительно является частью спецификации или если оно есть, то я уверен, что там происходит какое-то неявное принуждение. В любом случае, полагаться на такое поведение, которое может нарушиться, когда базовые изменения хранилища данных не рекомендуются. Почему бы просто не указать правильный тип?

+0

1. Я все еще не понимаю, почему я должен объявить тип. Насколько я знаю, команда UPDATE с SET MY_COLUMN = NULL будет работать над каждым типом столбца, так почему же этого недостаточно? – MosheElisha

+0

2. У меня есть метод, который получает строку SQL и коллекцию и вызывает PreparedStatement.setObject/setNull для каждого объекта. Если я хочу, чтобы правильный тип был передан setNull, мне нужно передать тип каждого объекта и создать уродливое if. Если драйвер базы данных может работать с setObject, на мой взгляд, он должен обрабатывать setNull и проверять внутренне. – MosheElisha

+1

@user: по отношению к 1; как я уже упоминал, JDBC - это попытка стандартизировать взаимодействие с базой данных, но каждая реализация базы данных имеет свой собственный способ делать вещи. Например, я слышал, что Oracle жалуется, что при установке NULL не задан правильный тип. Следовательно, JDBC требует, чтобы вы указали тип, независимо от того, передает ли базовая реализация JDBC его в базу данных другое. Невозможно помочь, если конкретный протокол проводки базы данных решает, что типы передаются при установке значений NULL, поэтому нет смысла рассуждать об этом. –

7

Драйверы JDBC, кажется, удаляются от setNull. См. Add support for setObject(<arg>, null).

Мой список баз данных, поддерживающих более логическое поведение является:

  1. Oracle
  2. MySQL
  3. Sybase
  4. MS SQL Server
  5. HSQL

Мой список баз данных НЕ поддерживает это логическое поведение:

  1. Derby Queries with guarded null Parameter fail
  2. PostgreSQL Cannot pass null in Parameter in Query for ISNULLSuggested solution
+0

Полезно знать. Благодаря! – MosheElisha

1

Когда дело доходит до Oracle, было бы очень неразумно использовать varchar2 по отношению к другим типам данных. Это может обмануть оптимизатора, и вы можете получить плохой план выполнения. Например, фильтрация в столбце даты с использованием типа данных timestamp в вашей привязке, Oracle может завершить чтение всех ваших строк, преобразующих все даты в метку времени, а затем отфильтровывая нужные строки. Если у вас есть указатель на столбце даты, это может даже ухудшиться (если оракул решил использовать его) - делать одиночные чтения на ваших блоках оракула.

--Lasse

Смежные вопросы