SQL-Code:
update as400 set
sequence = case
when waaunr = '408216' and waaupo = 0 and oaagnr = 10 then 1
when waaunr = '408217' and waaupo = 0 and oaagnr = 10 then 2
when waaunr = '408218' and waaupo = 0 and oaagnr = 10 then 3
else sequence
end,
frozen = case
when waaunr = '408216' and waaupo = 0 and oaagnr = 10 then 1
when waaunr = '408217' and waaupo = 0 and oaagnr = 10 then 1
when waaunr = '408218' and waaupo = 0 and oaagnr = 10 then 0
else frozen
end,
plan_date = case
when waaunr = '408216' and waaupo = 0 and oaagnr = 10 then '2019-07-05'
when waaunr = '408217' and waaupo = 0 and oaagnr = 10 then '2019-07-05'
when waaunr = '408218' and waaupo = 0 and oaagnr = 10 then '2019-07-06'
else plan_date
end
where waaunr in ('408216', '408217', '408218')
Geht es damit?
Würde aber ggfls. eine kaum überschaubare Menge von Datensätzen verändern, die nicht verändert werden muss.
Aber eigentlich:
Wenn oaagnr unterschiedlich sein kann, dann muss das Update halt eben für jeden der möglichen Werte gemacht werden. Dann reicht halt eben ein "globalgalaktisches" Update für "alles in einem Rutsch" nicht aus.
Und wenn waaupo nicht immer gleich ist, dann muss eben für jede zulässige Kombination aus waaupo, oaagnr und waaunr ein Update gemacht werden.
SQL ist übrigens bei kleinen Datenmengen deutlich schneller, als bei "einmal grob so alles mögliche und dann mal schaun, ob's eventuell doch nicht passt"
Die Ausführung vieler Updates mit exakten Angaben zu waaupo, oaagnr und waaunr kann daher deutlich schneller sein, als die momentan favorisierte Variante und: Das gerade aktut auftretende Problem muss nicht irgendwie umschifft werden sondern tritt garnicht erst auf und vermeidet ggfls. fälschlich durchgeführte Updates auf Datensätze, die nicht geändert werden müssen. Was z. B. bei meinem obigen Updatestatement der Fall ist. Gibt es da auf der Datenbank irgendwelche Trigger, so werden diese auch ausgeführt, was durchaus kontraproduktiv sein kann, wenn sie z. B. eine Versionierung ... durchführen.
Im konkreten Fall erwarte ich eigentlich dashier:
SQL-Code:
update as400 set sequence = 1, frozen = 1, plan_date = '2019-07-05' where waaunr = '408216' and waaupo = 0 and oaagnr = 10;
update as400 set sequence = 2, frozen = 1, plan_date = '2019-07-05' where waaunr = '408217' and waaupo = 0 and oaagnr = 10;
update as400 set sequence = 3, frozen = 0, plan_date = '2019-07-06' where waaunr = '408218' and waaupo = 0 and oaagnr = 10;
Man kann
SQL-Statements wunderbar parametrisieren:
SQL-Code:
update as400 set sequence = :sequence, frozen = :frozen, plan_date = :plan_date
where waaunr = :waaunr and waaupo = :waaupo and oaagnr = :oaagnr;
und hat damit im Quelltext nur noch ein kurzes und verständliches Updatestatement.
Das ruft man dann für jede erforderliche Wertekombination auf, wobei das im Quelltext vermutlich deutlich einfacher umzusetzen ist, als der Zusammenbau des momentan genutzten Statements.