zOs/SQL/BIPA2MI2

delete from OA1P.tAdm42BindVal;
delete from OA1P.tAdm41BindKey ;
----- val rdl = rz db2system location ----------------------------------
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DBOF',   '01.01.2000', 20, 'RZ1', 'DBAF') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DBOF', '01.01.2008', 22, 'RZ8', 'DC0G') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DBOF', '01.01.2000', 40, 'RZ1', 'DBTF') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DBOF', '01.01.2008', 42, 'RZ8', 'DD0G') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DBOF', '01.01.2008', 44, 'RZZ', 'DE0G') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DBOF', '01.01.2000', 60, 'RR2', 'DBOF') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DBOF', '01.01.2000', 80, 'RZ2', 'DBOF') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DVBP', '01.01.2012', 22, 'RZ8', 'DCVG') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DVBP', '01.01.2000', 40, 'RZ1', 'DVTB') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DVBP', '01.01.2008', 42, 'RZ8', 'DDVG') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DVBP', '01.01.2008', 44, 'RZZ', 'DEVG') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DVBP', '01.01.2000', 60, 'RR2', 'DVBP') ;
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    values('rdl', 'DVBP', '01.01.2000', 80, 'RZ2', 'DVBP') ;
insert into OA1P.tAdm42BindVal
       (type, key, installBegin, seq, va1, va2)
    select type, 'DBOF>DVBP', installBegin, seq, va1, va2
      from OA1P.tAdm42BindVal where type = 'rdl' and key = 'DBOF';
insert into OA1P.tAdm42BindVal
       (type, key, installBegin, seq, va1, va2)
    select type, 'DBOF>DVBP', installBegin, seq+1, va1, va2
      from OA1P.tAdm42BindVal where type = 'rdl' and key = 'DBOF';
update OA1P.tAdm42BindVal set va3 = 'CHROI000DCVG'
    where type = 'rdl' and key = 'DBOF>DVBP' and seq = 23;
update OA1P.tAdm42BindVal set va3 = 'CHSKA000DVTB'
    where type = 'rdl' and key = 'DBOF>DVBP' and seq = 41;
update OA1P.tAdm42BindVal set va3 = 'CHROI000DDVG'
    where type = 'rdl' and key = 'DBOF>DVBP' and seq = 43;
update OA1P.tAdm42BindVal set va3 = 'CHROI00ZDEVG'
    where type = 'rdl' and key = 'DBOF>DVBP' and seq = 45;
update OA1P.tAdm42BindVal set va3 = 'CHSKA000DVBP'
    where type = 'rdl' and key = 'DBOF>DVBP' and seq = 61;
update OA1P.tAdm42BindVal set va3 = 'CHSKA000DVBP'
    where type = 'rdl' and key = 'DBOF>DVBP' and seq = 81;
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select type, 'DBOF>DBOL', seq, va1, va2, installBegin
      from OA1P.tAdm42BindVal where type = 'rdl' and key = 'DBOF';
insert into OA1P.tAdm42BindVal
          (type, key, seq, va1, va2, va3, installBegin)
    values('rdl', 'DBOF>DBOL', 81, 'RZ2', 'DBOF','CHSKA000DBOL'
                , '01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    select type, 'DVBP>DBOF', installBegin, seq, va1, va2
      from OA1P.tAdm42BindVal where type = 'rdl' and key  = 'DVBP';
insert into OA1P.tAdm42BindVal (type, key, installBegin, seq, va1, va2)
    select type, 'DVBP>DBOF', installBegin, seq+1, va1, va2
      from OA1P.tAdm42BindVal where type = 'rdl' and key  = 'DVBP';
update OA1P.tAdm42BindVal set va3 = 'CHROI000DC0G'
    where type = 'rdl' and key = 'DVBP>DBOF' and seq = 23;
update OA1P.tAdm42BindVal set va3 = 'CHSKA000DBTF'
    where type = 'rdl' and key = 'DVBP>DBOF' and seq = 41;
update OA1P.tAdm42BindVal set va3 = 'CHROI000DD0G'
    where type = 'rdl' and key = 'DVBP>DBOF' and seq = 43;
update OA1P.tAdm42BindVal set va3 = 'CHROI00ZDE0G'
    where type = 'rdl' and key = 'DVBP>DBOF' and seq = 45;
update OA1P.tAdm42BindVal set va3 = 'CHSKA000DBOF'
    where type = 'rdl' and key = 'DVBP>DBOF' and seq = 61;
update OA1P.tAdm42BindVal set va3 = 'CHSKA000DBOF'
    where type = 'rdl' and key = 'DVBP>DBOF' and seq = 81;
----- key rdl = rz db2system location ----------------------------------
insert into OA1P.tAdm41BindKey (type, prio, key, installBegin)
                values    ('rdl', '00', 'DBOF', '01.01.2000');
insert into OA1P.tAdm41BindKey (type, prio, appl, key, installBegin)
                values    ('rdl', '00', 'ELA%', 'DVBP', '01.01.2000');
insert into OA1P.tAdm41BindKey (type, prio, pgm, key, installBegin)
with a as
(
select appl a, pgm p , collid c, date(createdTS) r,
     strip(ssid) || '>' || strip(location) || '-' || strip(qualifier) t
    from oa1p.bind_exceptions
    where ssid <> 'DAEG'
)
, b as
(    select a, p, c, r,
         row_number() over(partition by a, p, c
                       order by t) l,
         t
     from a
)
, c (a, p, c, r, l, t, u) as
(    select a, p, c, r, 1, t, varchar(t, 2000) from b where l = 1
     union all select c.a, c.p, c.c, min(c.r, b.r),
               c.l+1, b.t, c.u || ' ' || b.t
          from b, c
          where b.a = c.a and b.p = c.p and b.c = c.c and b.l = c.l+1
                and c.l < 100
)
, d as
(
    select a, p, c, min(r) r, max(l) l, min(t) tFr, max(t) tTo, max(u) t
      from c
      group by a, p, c
)
, e as
( select
   case when a in ('A18Q', 'DBTST', 'DB2J')  then '-'
        when p = 'AU5070' or p like 'YAU03%' then 'DBOF>DVBP'
        when p = 'YCDPUT2' then '-'
        when l = 12 and tFr = 'DBBA>-OA1A'
             and left(tTo, 17) = 'DVTB>CHSKA000DBTF' then 'DVBP>DBOF'
        when l > 4  and tFr = 'DBAF>-OA1A'
             and (tTo = 'DBTF>CHSKA000DVTB-OA1T'
                or tTo like 'DE0G>CH%DEVG-OA1P') then 'DBOF>DVBP'
        when t = 'DBOF>-OA1P DBOF>CHSKA000DBOL-OA1P' then 'DBOF>DBOL'
        else '???'
   end n,
   d.* from d
)
select 'rdl', '20', p, n, r   ---   , l, tFr, tTo, t
     from e where n <> '-'
;
----- key q: base qualifier ----(no val|) ------------------------------
insert into OA1P.tAdm41BindKey (type, prio, key, installBegin)
                values    ('q', '00', 'OA1P', '01.01.2000');
insert into OA1P.tAdm41BindKey (type, prio, appl, key, installBegin)
                values    ('q', '02', 'ELA%', 'BUA', '01.01.2000');
insert into OA1P.tAdm41BindKey (type, prio, dbSy, key, installBegin)
                values    ('q', '05', 'DBAF', 'OA1A', '01.01.2000');
insert into OA1P.tAdm41BindKey (type, prio, dbSy, key, installBegin)
                values    ('q', '05', 'DBTF', 'OA1T', '01.01.2000');

----- val cq: collection qualifier ------------------------------------
declare global temporary table session.i
 (i int not null, c2 char(2) not null) ccsid unicode;
insert into session.i
    select i, right('0000' || strip(char(i)), 2) c2
            from (select row_number() over() -1 i
                   from sysibm.sysColumns fetch first 100 rows only)s
 ;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', '$',   1,   '$',  '$', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select 'cq', 'AV-03', i, 'AV' || c2, '$' || c2, '01.01.2000'
         from session.i where i > 0 and i <= 3
;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select 'cq', 'AV-03-22', i, 'AV' || c2, '$' || c2, '01.01.2000'
         from session.i where i in (1, 2, 3, 21, 22)
;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select 'cq', 'AV-10-32', i, 'AV' || c2, '$' || c2, '01.01.2000'
         from session.i where i in(1,2,3,5,6,7,8,9,10,28,29,30,31,32)
;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select 'cq', 'AVALL', i, 'AV' || c2, '$' || c2, '01.01.2000'
         from session.i where i > 0 and i <= 32 and i <> 4
;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'AV0101',   1,   'AV01',  '$01', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'AV0101',   1,   'AV02',  '$01', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'AV12',   1,   'AV',  '$12', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select 'cq', 'BE-04', i, 'BE' || c2, '$' || c2, '01.01.2000'
         from session.i where i > 0 and i <= 4
;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'BE+04', 0,   'BE',  '$', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select 'cq', 'BE+04', i, 'BE' || c2, '$' || c2, '01.01.2000'
         from session.i where i > 0 and i <= 4
;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'CD', 1,   'CD',  '$', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'CTCZ', 1,   'CT',  '$', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'CTCZ', 2,   'CZ',  '$', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'KE', 1,   'KE',  '$', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'NI-02', 2,   'NI01',  '$01', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'NI-02', 3,   'NI02',  '$02', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'NI+02', 0,   'NI',  '$', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'NI+02', 1,   'NI01',  '$01', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
            values('cq', 'NI+02', 2,   'NI02',  '$02', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select 'cq', 'PC-02', i, 'PC' || c2, '$' || c2, '01.01.2000'
         from session.i where i > 0 and i <= 2
;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select 'cq', 'PCALL', i, 'PC' || c2, '$' || c2, '01.01.2000'
         from session.i where i > 0 and i <= 16
;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
    select 'cq', 'XCALL', i, 'XC' || c2, '$' || c2, '01.01.2000'
         from session.i where i >= 0 and i <= 9
;
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
         values('cq', 'YY+',   1,   '$',  '$', '01.01.2000');
insert into oa1p.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
         values('cq', 'YY+',  10,  'YY',  '$', '01.01.2000');
----- key cq: collection qualifier ------------------------------------
insert into OA1P.tAdm41BindKey (type, pgm, prio, key, installBegin)
    values('cq', '%', '00', '$', '01.01.2000');
insert into OA1P.tAdm41BindKey (type, pgm, prio, key, installBegin)
with a as --- left join old tables -------------------------------------
(
   select value(p.appl  , e.appl)   appl
       ,  value(p.pgm   , e.pgm )   pgm
       ,  value(p.collid, e.collid) col
       ,  value(p.installdate, e.installdate) installDate
       ,  value(p.qualifier, '') pQua
       ,  value(e.qualifier, '') eQua
       ,  value(e.ssid, '')      eDbSy
       ,  value(e.location, '')  eLoc
     from oa1p.bind_parameters p left join oa1p.bind_exceptions e
         on p.appl = e.appl
           and p.pgm = e.pgm
           and p.collid = e.collid
           and p.installdate = e.installdate
)
, b as --- add default Qualifier and Collection
(
  select a.*
    , case when appl like 'ELA%'    then 'BUA' else 'OA1$' end quaVar
    , case when appl like 'ELA%'    then 'BUA'
           when eDbSy = 'DBAF' then 'OA1A'
           when eDbSy = 'DBTF' then 'OA1T'
                               else 'OA1P' end quaDef
    , case when left(pgm, 2) = 'YX' then 'YX'
           when left(pgm, 2) = 'YY' then 'YY'
           when left(pgm, 1) = 'Y'  then substr(pgm, 2, 2)
           else left(pgm, 2) end colDef
    ,  row_number() over(partition by appl, pgm, eDbSy, eLoc
                         order by col) r
    from a
    where appl <> 'A18Q' and appl <> 'B18Q'
        and pgm not in ('DEFAULT', 'DBWK1', 'DB2WK1'
--                     ,'YAVCPID', 'YAVX012', 'YAV0129', 'NI8340'
--                     ,'NI8660', 'NI6880')
                       )
        and col not in ('DI_DRDA', 'EK_DRDA', 'RM_DRDA', 'TR_DRDA')
)
, d as --- add qualifier ----------------------------------------------
(
  select b.*
    , case when eQua is not null and eQua <> '' then eQua
           when pQua is not null and pQua <> '' then pQua
           else raise_error(77001, pgm || ': no qua')
      end qua
    from b
)
, e --- recursive build lists of colls/quals --------------------------
         ( appl, pgm, col, installdate, eDbSy, eLoc
         , quaVar, quaDef, colDef, r, qua, quals, colls) as
(
  select appl, pgm, col, installdate, eDbSy, eLoc
      , quaVar, quaDef, colDef, r, qua
      , cast(strip(qua) as varchar(1000))
      , cast(strip(col) as varchar(1000))
    from d where r = 1
  union all select e.appl, e.pgm, d.col, e.installdate
     , e.eDbSy, e.eLoc, d.quaVar, d.quaDef, d.colDef, e.r+1, d.qua
     , e.quals || ' ' || strip(d.qua)
     , e.colls || ' ' || strip(d.col)
  from e join d
    on e.appl = d.appl and e.pgm = d.pgm
      and e.eDbSy = d.edbSy
      and e.eLoc = d.eLoc and e.r + 1 = d.r  and e.r < 999
)
, f as --- select maximal lists ----------------------------------------
(
  select appl, pgm, max(installdate) installDate, eDbSy, eLoc
     , min(col) colFr, max(col) colTo
     , min(colDef) colDef
     , min(qua) quaFr, max(qua) quaTo
     , min(quaVar) quaVar, max(quaVar) quaVarMax
     , min(quaDef) quaDef, max(quaDef) quaDefMax
     , max(r) r
     , max(quals) quals
     , max(colls) colls
    from e
    group by  appl, pgm, eDbSy, eLoc
)
, g1 as --- special quals ---------------------------------------------
(
  select f.*
    , case when quaDef <> quaDefMax
               then raise_error(77031, pgm || '@' || eDbSy
                   || ' quaDef ' || quaDef || ' ==> ' || quaDefMax)
           when quaDef in ('OA1A', 'OA1T', 'OA1P')
               then replace(quals, quaDef, 'OA1$') else quals end qualD
    , case when eDbSy = 'DBBA'
              then replace(quals, 'OA1A',  'OA1&')
           when eDbSy = 'DVTB'
               then replace(quals, 'OA1T',  'OA1&')
               else replace(replace(quals, quaDef,  'OA1&')
                                         , 'OA1$',  'OA1&') end qualV
    from f
)
, g  as --- group over all dbSys/Location -----------------------------
(
  select appl, pgm, max(installdate) installDate
      , min(colFr) colFr
      , max(colTo) colTo
      , min(colDef) colDef, max(colDef) colDefMax
      , min(colls) colls, max(colls) collMax
      , min(quaFr) quaFr
      , max(quaTo) quaTo
      , min(quaVar) quaVar, max(quaVarMax) quaVarMax
      , min(quals) quals, max(quals) qualMax
      , min(qualD) qualD, max(qualD) quaDMax
      , min(qualV) qualV, max(qualV) quaVMax
      , count(*) gR
    from g1
    group by appl, pgm
)
, h2  as --- check wether no bad change within dbSys/Location ----------
(
  select appl, pgm, installDate, colFr, colTo, colDef
      , quaVar, quaFr, quaTo, colls
      , case when colDef <> colDefMax
                then raise_error(77011, pgm || ' colDef '
                      || colDef || ' ==> ' || colDefMax)
             when colls <> collMax
                then raise_error(77013, pgm || ' colls '
                      || colls || ' ==> ' || collMax)
             when quaVar <> quaVarMax
                 then raise_error(77032, pgm
                   || ' quaVar ' || quaVar || ' ==> ' || quaVarMax)
             when quals = qualMax then quals
             when qualD = quaDMax then qualD
             when qualV = quaVMax then qualV
             else   raise_error(77022, pgm
                  || ' quals ' || quals || '  ==> ' || qualMax
                  || ' qualD ' || qualD || '  ==> ' || quaDMax
                  || ' qualV ' || qualV || '  ==> ' || quavMax)
        end quals
    from g
)
, h as --- colls und quals komprimieren --------------------------------
(
  select h2.*
     , replace(colls, ' ' || left(colls, 2), '=') collR
     , replace(quals, ' ' || left(quals, 4), '=') qualR
    from h2
)
, i as --- den neuen cq key bestimmen ----------------------------------
(
  select h.*
  , cast(case                                               --- default
      when colls = colDef and quals = quaVar then '-'
                    --- spezial: colls und quals nicht in sync --------
                                                            --- au
      when quals = 'OA1&' and colls = 'AU' then 'AU&'
                                                            --- av
      when collR = 'AV01=02=03=05=06=07=08=09=10=11=12=13=14=15'
           || '=16=17=18=19=20=21=22=23=24=25=26=27=28=29=30=31=32'
          and qualR='OA1$01=02=03=09=09=09=09=09=10=09=09=09=09=09'
           || '=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09'
        then 'AV/Y/X012'
      when collR = 'AV01=02=03=05=06=07=08=09=10=11=12=13=14=15'
           || '=16=17=18=19=20=21=22=23=24=25=26=27=28=29=30=31=32'
          and qualR='OA1$01=02=03=05=06=07=08=09=10=11=12=12=12=12'
           || '=16=17=18=19=20=21=22=23=24=25=26=27=28=29=30=31=32'
        then 'AV/Y/0129'
      when collR = 'AV01=02' and qualR = 'OA1$01=01'
          then 'AV0101'
      when collR = 'AV01=02=03=05=06=07=08=09=10=11=12=13=14=15'
           || '=16=17=18=19=20=21=22=23=24=25=26=27=28=29=30=31=32'
          and qualR='OA1$02=02=03=05=06=07=08=09=10=11=12=13=14=15'
           || '=16=17=18=19=20=21=22=23=24=25=26=27=28=29=30=31=32'
        then 'AV/Y/CPID'
      when collR = 'AV' and quals = 'OA1P12' then 'AV12'
                                                            --- be
      when collR = 'BE=01=02=03=04' and qualR = 'OA1$01=01=02=03=04'
          then 'BE+04'
      when colls = 'CT CZ' and qualR = 'OA1$=' then 'CTCZ'  --- ctcz
      when colls = coldef ||' YY' and qualR = 'OA1$='       --- + yy
              then 'YY+'
      when colls = 'OA1P01 OA1P02' and qualR = 'OA1$01=02'  --- oa1p
          then 'OA1P-02'
                                                            --- allgemei
      when quals = 'OA1&' and colls = colDef then 'DVTB&'
      when quals = 'OA1A' and colls = colDef then 'OA1A'
                    --- error if colls und quals nicht in sync--------
      when 'OA1$' || substr(collR, 3) <> qualR --en '???quals/coll'
          then raise_error(77021, pgm || ' colls ' || collR
                 || ' mismatches quals ' || qualR)
                                                        --- av
      when right(collR, 83) = '05=06=07=08=09=10=11=12=13=14=15=16'
            ||  '=17=18=19=20=21=22=23=24=25=26=27=28=29=30=31=32'
             and left(collR, 14) in ('AV01=02=03=05='
                    , 'AV01=02=05=06=', 'AV05=06=07=08=' )
          then 'AVALL'
      when collR in ('AV01=02=03', 'AV01=02','AV03') then 'AV-03'
      when collR in ('AV01=02=03=05=06=07=08=09=10'
                    ,'AV01=02=03=28=29=30=31=32'
                    ,'AV01=02=09=10=28=29=30=31=32'
                    ,'AV28=29=30=31=32') then 'AV-10-32'
      when collR =   'AV01=02=03=21=22' then 'AV-03-22'
      when collR = 'BE01=02=03=04' then 'BE-04'         --- be
      when collR = 'NI01=02'            then 'NI-02'    --- ni
      when collR = 'NI=01=02'           then 'NI+02'
      when collR in ('PC01=02', 'PC01') then 'PC-02'    --- pc
      when collR in
           ('PC01=02=03=04=05=06=07=08=09=10=11=12=13=14=15=16'
           ,'PC01=02=03=04=05=06=07=08=09=10=11=13=14=15=16')
                                       then 'PCALL'
                                                        --- xc
      when collR = 'XC00=01=02=03=04=05=06=07=08=09' then 'XCALL'
                                                        --- allgemei
      when colls in ('BE', 'CD', 'KE') then colls
      else '???'
    end as char(10)) cq
    from h
)
select 'cq', pgm, '20', cq, installDate
    from i
    where cq <> '-'
;
update OA1P.tAdm41BindKey set type = 'q'
                            , dbSy = 'DVTB'
                            , key = 'OA1T'
    where type = 'cq' and key = 'AU&'
;
----- val ov: bindOptions values --------------------------------------
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'default',  110,  'OWNER', 'CMNBATCH','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'default',   210,  'ISOLATION', 'CS','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'default',   220,  'DEGREE', '1','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'default',   310,  'DYNAMICRULES', 'BIND','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'default',   320,  'VALIDATE', 'BIND','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'default',   910,  'EXPLAIN', 'YES','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'default',   920,  'FLAG', 'I','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'default',   930,  'SQLERROR', 'NOPACKAGE','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'default',  9999,    'ACTION', 'REPLACE','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'degAny', -9999, '-->parent', 'default', '01.01.2000') ;
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'degAny',    220,  'DEGREE', 'ANY','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'valRun', -9999, '-->parent', 'default', '01.01.2000') ;
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'valRun',   320,  'VALIDATE', 'RUN','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'optHBD1',-9999, '-->parent', 'default', '01.01.2000') ;
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'optHBD1',    330,  'OPTHINT', 'HBD1','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'optOH',  -9999, '-->parent', 'default', '01.01.2000') ;
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'optOH',    330,  'OPTHINT', 'OH' ,'01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'reoAlw', -9999, '-->parent', 'default', '01.01.2000') ;
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'reoAlw',    340,  'REOPT', 'ALWAYS','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'dynRun', -9999, '-->parent', 'default', '01.01.2000') ;
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'dynRun',    310,  'DYNAMICRULES', 'RUN','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'dynValRun',-9999,'-->parent','dynRun', '01.01.2000') ;
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'dynValRun',   320,  'VALIDATE', 'RUN','01.01.2000');
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'relDea', -9999, '-->parent', 'default', '01.01.2000') ;
insert into OA1P.tAdm42BindVal (type, key, seq, va1, va2, installBegin)
 values('ov', 'relDea',    230,  'RELEASE', 'DEALLOCATE','01.01.2000');
insert into OA1P.tAdm41BindKey (type, prio, appl, pgm, rz, dbSy,
           key, installBegin)
    values('ov', '00', '%', '%', '%', '%', 'default',
                           '01.01.2000')
;
insert into OA1P.tAdm41BindKey (type, prio, appl, pgm, rz, dbSy,
           key, installBegin)
with n as
( select APPL
       , PGM
       , COLLID
       , INSTALLDATE
,case when OWNER        <> '' then owner        else null end owner
,case when QUALIFIER    <> '' then QUALIFIER    else null end QUALIFIER
,case when ISOLATION    <> '' then ISOLATION    else null end ISOLATION
,case when EXPLAIN      <> '' then EXPLAIN      else null end EXPLAIN
,case when CURRENTDATA <> '' then CURRENTDATA else null end CURRENTDATA
,case when RELEASE      <> '' then RELEASE      else null end RELEASE
,case when DBPROTOCOL  <> '' then DBPROTOCOL  else null end DBPROTOCOL
,case when DEGREE       <> '' then DEGREE       else null end DEGREE
,case when DYNAMICRULES <> '' then DYNAMICRULES else null end
              DYNAMICRULES
,case when KEEPDYNAMIC <> '' then KEEPDYNAMIC else null end KEEPDYNAMIC
,case when REOPT        <> '' then REOPT        else null end REOPT
,case when OPTHINT      <> '' then OPTHINT      else null end OPTHINT
,case when IMMEDWRITE   <> '' then IMMEDWRITE   else null end IMMEDWRITE
,case when FLAG         <> '' then FLAG         else null end FLAG
,case when PATH         <> '' then PATH         else null end PATH
,case when VALIDATE     <> '' then VALIDATE     else null end VALIDATE
,case when SQLERROR     <> '' then SQLERROR     else null end SQLERROR
,case when SQLRULES     <> '' then SQLRULES     else null end SQLRULES
,case when DEFER        <> '' then DEFER        else null end DEFER
,case when ENCODING     <> '' then ENCODING     else null end ENCODING
,case when ROUNDING     <> '' then ROUNDING     else null end ROUNDING
    from oa1p.bind_parameters
)
, d as
( select
       case when s.pgm <> 'DEFAULT' then 's' else ' ' end
    || case when a.appl <> 'DEFAULT' then 'a' else ' ' end
    || case when d.appl is null then ' ' else 'd' end sad
--alue(s.$           ,a.$           ,d.$           ) $
,value(s.APPL        ,a.APPL        ,d.APPL        ) APPL
,value(s.PGM         ,a.PGM         ,d.PGM         ) PGM
,value(s.COLLID      ,a.COLLID      ,d.COLLID      ) COLLID
,value(s.INSTALLDATE ,a.INSTALLDATE ,d.INSTALLDATE ) INSTALLDATE
,value(s.OWNER       ,a.OWNER       ,d.OWNER       ) OWNER
,value(s.QUALIFIER   ,a.QUALIFIER   ,d.QUALIFIER   ) QUALIFIER
,value(s.ISOLATION   ,a.ISOLATION   ,d.ISOLATION   ) ISOLATION
,value(s.EXPLAIN     ,a.EXPLAIN     ,d.EXPLAIN     ) EXPLAIN
,value(s.CURRENTDATA ,a.CURRENTDATA ,d.CURRENTDATA ) CURRENTDATA
,value(s.RELEASE     ,a.RELEASE     ,d.RELEASE     ) RELEASE
,value(s.DBPROTOCOL  ,a.DBPROTOCOL  ,d.DBPROTOCOL  ) DBPROTOCOL
,value(s.DEGREE      ,a.DEGREE      ,d.DEGREE      ) DEGREE
,value(s.DYNAMICRULES,a.DYNAMICRULES,d.DYNAMICRULES) DYNAMICRULES
,value(s.KEEPDYNAMIC ,a.KEEPDYNAMIC ,d.KEEPDYNAMIC ) KEEPDYNAMIC
,value(s.REOPT       ,a.REOPT       ,d.REOPT       ) REOPT
,value(s.OPTHINT     ,a.OPTHINT     ,d.OPTHINT     ) OPTHINT
,value(s.IMMEDWRITE  ,a.IMMEDWRITE  ,d.IMMEDWRITE  ) IMMEDWRITE
,value(s.FLAG        ,a.FLAG        ,d.FLAG        ) FLAG
,value(s.PATH        ,a.PATH        ,d.PATH        ) PATH
,value(s.VALIDATE    ,a.VALIDATE    ,d.VALIDATE    ) VALIDATE
,value(s.SQLERROR    ,a.SQLERROR    ,d.SQLERROR    ) SQLERROR
,value(s.SQLRULES    ,a.SQLRULES    ,d.SQLRULES    ) SQLRULES
,value(s.DEFER       ,a.DEFER       ,d.DEFER       ) DEFER
,value(s.ENCODING    ,a.ENCODING    ,d.ENCODING    ) ENCODING
,value(s.ROUNDING    ,a.ROUNDING    ,d.ROUNDING    ) ROUNDING
    from n s
      left join n a
        on a.appl = s.appl and a.pgm = 'DEFAULT'
        and a.collid = 'DEFAULT'
      left join oa1p.bind_parameters d
        on d.appl = 'DEFAULT' and d.pgm = 'DEFAULT'
        and d.collid = 'DEFAULT'
)
, e as
(
  select
     left(release, 4) || left(degree, 4) || left(dynamicRules, 4)
       || left(reopt, 4) || left(opthint, 4) || left(validate, 4) comb,
     d.*
     from d
)
, f as
( select   case
           when comb = '    ANY BIND        BIND' then 'degAny   '
           when comb = '    1   BIND        BIND' then 'default  '
           when comb = '    1   BIND        RUN ' then 'valRun   '
           when comb = '    1   BIND    HBD1BIND' then 'optHBD1  '
           when comb = '    1   BIND    OH  BIND' then 'optOH    '
           when comb = '    1   BINDALWA    BIND' then 'reoAlw   '
           when comb = '    1   RUN         BIND' then 'dynRun   '
           when comb = '    1   RUN         RUN ' then 'dynValRun'
           when comb = 'DEAL1   BIND        BIND' then 'relDea   '
           else '$$$' end neu,
           e.*
     from e
)
select 'ov' type
     , case when pgm <> 'DEFAULT' then '20'
            else '10' end prio
     , left(case when appl = 'DEFAULT' or pgm <> 'DEFAULT'
           then '%' else appl end, 4) appl
     , case when pgm  = 'DEFAULT' then '%' else pgm  end pgm
     , '%' rz
     , '%' dbSy
--   , '%' location
     , neu key
     , installDate installBegin
 --  , f.*
     from f
     where appl not like 'A18Q%'
       and neu <> 'default'
;x;
insert into OA1P.tAdm41BindKey (type, prio, key, installBegin)
                values    ('path', '00', 'DBOF', '01.01.2000');
insert into OA1P.tAdm41BindKey (type, prio, appl, key, installBegin)
                values    ('path', '00', 'ELA%', 'DVBP', '01.01.2000');
insert into OA1P.tAdm41BindKey (type, prio, pgm, key, installBegin)
with a as
(
select appl a, pgm p , collid c, date(createdTS) r,
     strip(ssid) || '>' || strip(location) || '-' || strip(qualifier) t
    from oa1p.bind_exceptions
    where ssid <> 'DAEG'
)
, b as
(    select a, p, c, r,
         row_number() over(partition by a, p, c
                       order by t) l,
         t
     from a
)
, c (a, p, c, r, l, t, u) as
(    select a, p, c, r, 1, t, varchar(t, 2000) from b where l = 1
     union all select c.a, c.p, c.c, min(c.r, b.r),
               c.l+1, b.t, c.u || ' ' || b.t
          from b, c
          where b.a = c.a and b.p = c.p and b.c = c.c and b.l = c.l+1
                and c.l < 100
)
, d as
(
    select a, p, c, min(r) r, max(l) l, min(t) tFr, max(t) tTo, max(u) t
      from c
      group by a, p, c
)
, e as
( select
   case when a in ('A18Q', 'DBTST', 'DB2J')  then '-'
        when p = 'AU5070' or p like 'YAU03%' then 'DBOF>DVBP'
        when p = 'YCDPUT2' then '-'
        when l = 12 and tFr = 'DBBA>-OA1A'
             and left(tTo, 17) = 'DVTB>CHSKA000DBTF' then 'DVBP>DBOF'
        when l > 4  and tFr = 'DBAF>-OA1A'
             and tTo = 'DBTF>CHSKA000DVTB-OA1T' then 'DBOF>DVBP'
        when t = 'DBOF>-OA1P DBOF>CHSKA000DBOL-OA1P' then 'DBOF>DBOL'
        else '???'
   end n,
   d.* from d
)
select 'path', '20', p, n, r
     from e where n <> '-'
;
delete from OA1P.tBiPaPgm;
commit;