I am new to Derby and I noticed that I face similar problems as when using the DB2 RDBMS as far as null
values are concerned. The Derby documentation states, th
What if you leave the column values as question-mark substitution values in your PreparedStatement, and then set the values at runtime using PreparedStatement.setObject(N, null)?
In general, your library will prefer to provide column values by substituting parameter values, to handle issues like quotation marks in strings, datatype conversions, etc., and I think that this general substitution mechanism should handle your null value problems as well.
If you use the VALUES clause on your INSERT, you don't have to cast the NULL values:
insert into T_AUTHOR (
ID, FIRST_NAME, LAST_NAME,
DATE_OF_BIRTH, YEAR_OF_BIRTH, ADDRESS)
VALUES (
1000, 'Lukas', 'Eder',
'1981-07-10', null, null
);
This will work like you expect (i.e. the database can determine that the NULLs correspond to an integer and varchar(500). This works in both DB2 and Derby (and should work in pretty much any other database engine, as well).
You can use VALUES with parameter markers as well, without having to CAST them.
The reason that you have to cast when issuing an insert into ... select from
statement is because the SELECT portion takes precedence -- the select statement returns certain data types, regardless of whether they are compatible with the table you're trying to insert them in to. If they aren't compatible, you will either get an error (with strongly typed database engines like DB2 <= 9.5) or the engine will do implicit type conversion (when possible).
DB2 uses the null indicator... for example
EXEC SQL INSERT INTO TABNAM (FILD1, FILD2)
VALUES (:HOSTVAR1, :HOSTVAR2:NULL-IND2) END-EXEC.
notice the NULL-IND2 field which can be set to a -1 to indicate that this field in the database table should be null.
Is there a similar indicator for JDBC or Derby?
Maybe this solution helps you:
insert into T_AUTHOR (
ID,
FIRST_NAME,
LAST_NAME,
DATE_OF_BIRTH,
YEAR_OF_BIRTH,
ADDRESS
) select
1000,
'Lukas',
'Eder',
'1981-07-10',
(select YEAR_OF_BIRTH from T_AUTHOR where true = false),
(select ADDRESS from T_AUTHOR where true = false)
from SYSIBM.SYSDUMMY1
This method does not require explicit cast of null
, because inner select
will return null with required type.