venerdì 7 agosto 2015




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