Manejo de Derby de valores NULL
Soy nuevo en Derby y noté que me enfrento a problemas similares a los de utilizar el RDBMS de DB2 en lo que respecta anull
los valores están preocupados. La documentación de Derby establece que unnull
el valor debe tener un tipo asociado (algo que DB2 finalmente eliminó en la versión 9.7):
http://db.apache.org/derby/docs/10.7/ref/crefsqlj21305.html
Ahora estoy tratando de encontrar ungeneral solución a este problema aquí ya que esto será parte de mi biblioteca de abstracción de base de datosjOOQ. El siguiente ejemplo solo documenta el problema. Piense en cualquier otro ejemplo (más complejo). Lo siguiente no funciona:
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
Tampoco esto (que es lo que realmente hace jOOQ):
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
select ?, ?, ?, ?, ?, ?
from SYSIBM.SYSDUMMY1
Porque los dosnull
Los valores no tienen ningún tipo asociado. La solución sería escribir algo como esto:
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
O así, respectivamente
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
Pero muy a menudo, en Java, el tipo quenull
debe ser lanzado a es desconocido:
int
), pero eso no funcionaría en este ejemplo, ya que no puede poner uncast(null as int)
valor enADDRESS
.Con HSQLDB (otro candidato para este problema), simplemente puedo escribircast(null as object)
que funcionará en la mayoría de los casos. Pero Derby no tiene unobject
tipo.Este problema me ha molestado antes con DB2 y todavía no he encontrado una solución. ¿Alguien sabe de unestableygeneral solución a este problema para cualquiera de estos RDBMS?
derbyDB2