SQL INSERT e UPDATE
come semplificarsi la vita con le extended host vars
inserire o modificare un dato in tabella con static sql può essere a volte un'impresa:
se volessi aggiornare uno o più campi solo se diverso da un certo valore, impostare campi a null, a default etc. sarei obbligato ad usare delle CASE che renderebbero l'istruzione più complessa da disegnare e da testare.
per esempio se desiderassi
modificare il campo C1 e C3 solo se la variabile da impostare è diversa da 'A'
modificare il campo C2 impostandolo a null solo se la variabile da impostare è uguale a 'N'
dovrei codificare qualcosa come
update schema.table
set c1 = case when :hostVar1<>'A' then :hostvar1 else c1 end,
set c2 = case when :hostVar2='N' then nulle else :hostvar2 end,
set c3 = case when :hostVar3<>'A' then :hostvar3 else c3 end
where ...
Dalla 6.1 sono disponibili gli indicatori estesi (simili a variabili indicatori, ma con differenti significati)
Variabili indicatori
sono quelle hostvar (small integer) normalmente utilizzate nella fetch per rilevare la presnza di NULL in un campo
Fetch from C1 into
:$campo1 $indicatore1,
:$campo2 $indicatore2
$indicatore1 e $indicatore2 avranno valore 0 se i campi sono valorizzati e -1 se sono NULL.
Variabili indicatori Estesi
usate nelle variabili in input, quindi in INSERT/UPDATE; possono assumere
- 0 per comunicare all'SQL Engine di trattare il campo normalmente
- -1 -2 -3 -4 -6 per comunicare all'SQL Engine di inserire NULL nel campo
- -5 per comunicare all'SQL Engine di inserire il Default_value del campo stesso nel campo
- -7 per comunicare all'SQL Engine di non assegnare il valore: il campo viene trattato come se non esistesse nello statement
impostando opportunamente le $hostVarInd1, $hostVarInd3, $hostVarInd3
l'istruzione si semplifica in
update schema.table
set c1=:hostVar1 :$hostVarInd1,
set c2=:hostVar2 :$hostVarInd2,
set c3=:hostVar3 :$hostVarInd3
where ...
Perchè le variabili estese possano essere utilizzare è indispensabile indicare al precompilatore di utilizzare la feature:
exec sql
set option extind=*yes;
Nessun commento:
Posta un commento