Я новичок в 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, и я еще не нашел решения. Кто-нибудь знает стабильное и общее решение этой проблемы для любой из этих СУБД?
- дерби
- DB2