Het probleem is verder geanalyseerd:
--
-- Op pgAdmin levert de volgende query enkele honderden rijen op ver in het verleden
-- (rond jaar 1) of in de toekomst (jaar 9000+).
--
select *
from "fJournaalpost"
where "documentDatum" > now()::date + interval '1 years'
or
"documentDatum" < now()::date - interval '200 years'
Blijkbaar bevat metacom veel documentdatums in het verre verleden en verre toekomst. Als vervolgstap is geprobeerd deze data te verwerken en te kijken of een foutmelding optreedt:
--
-- Hiervoor maken we eerst een lege laadtabel met de juiste velden:
--
create or replace table mc_fjournaalpost@sql
as
select *
from fJournaalpost@mc
where false
--
-- Vervolgens probeer we rijen te laden.
--
begin
for r
in
( execute native 'select *'
|| 'from "fJournaalpost"'
|| 'where 1=1'
|| 'and "documentDatum" < now()::date - interval ''200 years'''
datacontainer 'mc'
)
loop
begin
insert into mc_fjournaalpost@sql
( documentDatum
)
values
( r.documentDatum
);
exception
when others
then
dbms_output.put_line('FAIL:' || to_char(r.documentDatum, 'YYYYMMDDHH24MISS'));
end;
end loop;
end;
Dit drukt enkele honderden rijen af in dbms_output. Uiteindelijk blijkt de foutmelding op te wekken met bijvoorbeeld:
insert into mc_fjournaalpost@sql
( documentDatum
)
values
( to_date('10220110000000', 'YYYYMMDDHH24MISS')
)
De foutmelding is dan:
itgenspr113: The row.
0 = 01-01-1753, 1 = 31-12-9999.
Ook de volgende statements leiden tot een foutmelding (merk op dat documentDatum een datetime2-kolom is):
set invantive-sql-correct-invalid-date@sql true;
insert into mc_fjournaalpost@sql
( documentDatum
)
values
( to_date('10220110', 'YYYYMMDD')
)
Door het vertalen van documentDatum buiten Gregoriaanse kalender naar 1-1-1753 werkt het zonder fouten:
begin
for r
in
( execute native 'select *'
|| 'from "fJournaalpost"'
|| 'where 1=1'
|| 'and "documentDatum" < now()::date - interval ''200 years'''
datacontainer 'mc'
)
loop
begin
insert into mc_fjournaalpost@sql
( documentDatum
)
values
( case when r.documentDatum < to_date('17530101', 'YYYYMMDD') then to_date('17530101', 'YYYYMMDD') else r.documentDatum end
);
end;
end loop;
end;
Oplossing is de kopieerquery te herformuleren als:
create or replace table mc_fjournaalpost@sql
as
select * except documentDatum
, case
when documentDatum < to_date('17530101', 'YYYYMMDD')
then to_date('17530101', 'YYYYMMDD')
else documentDatum
end
documentDatum
from fJournaalpost@mc
De itgenspr113 is eigenlijk onterecht; datetime2 ondersteunt datums vanaf 1-1-0001.