zOs/REXX/XBSTAFOR

$#:
*       elar start force
*
*
*
dbSys = DVBP
paLim = 9e9
stLim = 1e9
saFrom = $''
sleepSt = 200
sleepMin = 30
sleepMax = 60
$#@
call sqlConnect $dbSys
call sql2St "select distinct STORAGEAREA from BUA.TXBI003" ,
                 "where storageArea >= '"$saFrom"' order by 1" ,
               , sa, ':m.dst'
sz = m.sa.0
say '*'time() sz 'storageAreas:' m.sa.1 '-' m.sa.sz
cDb = 0
cPa = 0
cSt = 0
$do sx=1 to m.sa.0 until cPa > $paLim | cSt > $stLim  $@/sa/
    $=stAr=- m.sa.sx
    say '*'time() sx'. storageArea' $stAr',',
                  cDb 'dbs,' cPa 'parts,' cSt 'starts'
    call sqlCommit
    $;
    $<=/sql/
with p as
( select t.creator cr, t.name tb, t.dbName db, t.tsName ts
     , r.partNumber pa, r.stage, r.status
     ,'XB' || R.STORAGEAREA || R.SEGMENT seg
     , R.objectFamily family
     , R.STORAGEAREA
   FROM sysibm.systables t
     join  BUA.TXBI003 R
       on t.creator = 'BUA'
         and left(t.name, 8) = 'XB'||STORAGEAREA||SEGMENT
)
, u as
(
  select t.*
    from BUA.TXBC021s t
    where EYRESS =  5000
        and ESRESS =  0
  union all select t.*
    from BUA.TXBC021 t
    where EYRESS =  5000
        and ESRESS =  0
)
select db, ts, pa, earess unl, cr, tb
    from p
      join u
        on u.eadba = p.seg
            and u.PARTNUMBER = p.pa
            and locate('.' || strip(db) || '.' || strip(ts) || '.'
                , u.eaRess) > 0
   where storageArea = '$stAr'
       and status = 1 and stage = 'UL'
    order by db, ts, pa
    with ur
$*( old  ----------------------------------------------------
with e as
( select
      'BUA' cr
     ,'XB'||R.STORAGEAREA||R.SEGMENT||
              X.EYKNGKLASS||X.EYKNGOCC||X.ENZEILE||X.ENSPALTE tb
     , partNumber pa
      ,R.*
   FROM
      BUA.TXBI003 R
   INNER JOIN
      BUA.TXBC091 X
      ON  EYPREF   = 'XB'
      AND ENSTORAR = R.STORAGEAREA
   where storageArea = '$stAr'
       and status = 1 and stage = 'UL'
)
, t as
( select dbName db, tsName ts, e.*
    from e left join sysibm.sysTables t
      on t.creator = e.cr and t.name = e.tb
)
, v as
(
  select * from BUA.TXBC021S
  union all select * from BUA.TXBC021
)
, u as
(
  select v.eaREss Unl, t.*
       FROM t left join v
         on v.EADBA =  left(t.tb, 8)
         WHERE EYRESS      =  5000
           AND ESRESS      =  0
         and v.partNumber = t.pa+0
         and locate(strip(db) || '.' || strip(ts), v.eaRess) > 0
)
select db, ts, pa, unl, cr, tb from u
order by db, ts, pa
with ur  -end old ------------------------ $*)
    $/sql/
    call sqlSel
    $| $forWith f $@/pa/
        if laDb \= $DB then do
            cDb = cDb + 1
            laDb = $DB
            call sqlDsn dh, $dbSys, '-dis db('$DB') sp(*)' ,
                 'restrict limit(*)'
            m.di.0 = 0
            call sqlDisDb di, dh
            say '*'time() cDb'. db' $DB',' cPa 'parts,' cSt 'starts,' ,
                'disInfo' m.di.0'/'m.dh.0
            end
        cPa = cPa + 1
        ix = sqlDisDbIndex(di, $DB, $TS, $PA)
        if ix < 1 | pos('COPY', m.di.ix.sta) < 1 then
             iterate
        if pos('WWW', $TS) > 0 then do
    $*(
        call csiOpen cc, $UNL' '
        if \ csiNext(cc, cr) then
            say '|||not exists unl' $UNL 'for' $DB'.'$TS':'$PA
        else if $UNL \= m.cr then
            say '|||unl' $UNL '<>' m.cr 'for' $DB'.'$TS':'$PA
        else do  $*)
           if cSt // $sleepSt = 0 then do
               say '---' cSt time() cmd
               if cSt > 0 then
                   call sleep trunc(max($sleepMax ,
                         - time('e') + sleepLast , $sleepMin)), 1
               sleepLast = time('e')
               end
           cSt = cSt + 1
           say  '-sta force' $DB'.'$TS':'$PA 'unl' $UNL
           cmd = '-sta db('$DB') sp('$TS') part('$PA') acc(force)'
      $**  call sqlDsn cc, $dbSys, cmd
           end
    $/pa/
    $/sa/
say '*'time() 'end' cDb 'dbs,' cPa 'parts,' cSt 'starts'
call sqlDisConnect
$#out                                              20131224 16:46:06