Я новичок в Derby и заметил, что сталкиваюсь с аналогичными проблемами, что и при использовании СУБД DB2 в отношении значений null
. Документация Derby гласит, что со значением null
должен быть связан тип, с которым DB2 наконец-то избавилась в версии 9.7:
http://db.apache.org/derby/docs/10.7/ref/crefsqlj21305.html
Теперь я пытаюсь найти общее решение этой проблемы здесь, так как оно будет частью моей библиотеки абстракций базы данных jOOQ . Приведенный ниже пример просто документирует проблему. Подумайте о любом другом (более сложном) примере. Следующее не работает:
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
select
1000, 'Lukas', 'Eder',
'1981-07-10', null, null
from SYSIBM.SYSDUMMY1
Ни один из них не делает этого (что на самом деле делает jOOQ):
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
select ?, ?, ?, ?, ?, ?
from SYSIBM.SYSDUMMY1
Поскольку два значения null
не имеют типа, связанного с ним. Решением было бы написать что-то вроде этого:
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
select
1000, 'Lukas', 'Eder',
'1981-07-10', cast(null as int), cast(null as varchar(500))
from SYSIBM.SYSDUMMY1
Или вот так, соответственно
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
select
?, ?, ?, ?, cast(? as int), cast(? as varchar(500))
from SYSIBM.SYSDUMMY1
Но очень часто в Java тип, к которому следует привести null
, неизвестен:
- В этом примере типы могут быть получены из условия вставки, но это может оказаться сложным или невозможным для более общих случаев использования.
- В других примерах я мог бы просто выбрать любой тип для приведения (например, всегда приведение к
int
), но это не сработает в этом примере, так как вы не можете поместить значение cast(null as int)
в ADDRESS
.
- С HSQLDB (другой кандидат для этой проблемы) я могу просто написать
cast(null as object)
, который будет работать в большинстве случаев. Но у Дерби нет типа object
.
Эта проблема раздражала меня в DB2 раньше, и я пока не нашел решения. Кто-нибудь знает о стабильном и общем решении этой проблемы для любой из этих СУБД?