【发布时间】:2011-02-05 08:11:34
【问题描述】:
我是 Derby 的新手,我注意到就null 值而言,我遇到了与使用 DB2 RDBMS 时类似的问题。 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),这在大多数情况下都可以使用。但 Derby 没有object类型。
这个问题以前一直困扰着我使用 DB2,我还没有找到解决方案。有谁知道针对这些 RDBMS 中的任何一个的稳定和通用解决方案?
- 德比
- DB2
【问题讨论】:
标签: sql null db2 derby strong-typing