L'istruzione UPDATE modifica i valori delle colonne
specificate, nelle righe selezionate, in una tabella in un database
esterno.
Tutte le righe per cui l'espressione della
clausola WHERE è TRUE vengono aggiornate nella tabella identificata da
TableReference.
Ciascuna riga viene esaminata a turno e viene impostata una variabile per
puntare alla riga corrente. Generalmente, l'espressione della clausola WHERE utilizza questa variabile
per accedere ai valori della colonna e così determina le righe da
aggiornare o lasciare non modificate, in base al relativo contenuto. La variabile è indicata da CorrelationName oppure, in
assenza di una clausola AS, da TableName. Quando una riga
è stata selezionata per l'aggiornamento, a ciascuna colonna indicata nella
clausola SET viene assegnato un nuovo valore come determinato
dall'espressione corrispondente. Tali espressioni possono fare riferimento alla variabile della riga corrente.
Riferimento di
tabella
Un riferimento di tabella è un caso particolare dei riferimenti di
campo utilizzati per fare riferimento alle strutture ad albero del messaggio. Inizia sempre con la parola
"Database" e può contenere quanto riportato
di seguito:
- Solo il nome della tabella
- Il nome dello schema ed il nome della tabella
- Il nome dell'origine dati (il nome di un'istanza del database), il nome
dello schema ed il nome della tabella
In ciascun caso, il nome può essere specificato direttamente oppure
mediante un'espressione racchiusa tra parentesi
({...}). Un nome di origine dati, di schema o di tabella specificato
direttamente è soggetto alla sostituzione del nome. Ossia, se il nome utilizzato è stato dichiarato per essere un nome
riconosciuto, viene utilizzato il valore del nome dichiarato invece del nome
stesso
(consultare
Istruzione DECLARE).
Se non viene
specificato il nome dello schema, viene utilizzato lo schema predefinito per
l'utente del database del broker.
Se non viene specificato il nome dell'origine dati, viene utilizzato il
database indicato dall'attributo data source del nodo.
Clausola WHERE
L'espressione della clausola WHERE può utilizzare tutte le funzioni e tutti gli operatori del broker in qualsiasi combinazione. Può fare riferimento a colonne di tabella, campi di messaggi e a costanti o
variabili dichiarate.
Tuttavia, tenere presente che il broker considera
l'espressione della clausola WHERE esaminando l'espressione e decidendo se
l'intera espressione può essere valutata dal database.
Se l'operazione è possibile, essa viene fornita al
database. Per essere valutata dal database, devono essere utilizzati solo gli
operatori e le funzioni supportati dal database.
La clausola WHERE, tuttavia, può fare riferimento a campi di
messaggi, a nomi di correlazione dichiarati dalle istruzioni SELECT e ad altre
costanti o variabili dichiarate all'interno dell'ambito.
Se l'intera espressione non può essere valutata dal
database, il broker ricerca gli operatori AND di livello principale ed esamina
separatamente ciascuna espressione secondaria. Quindi, prova a fornire al database le espressioni secondarie che possono
essere valutate, lasciando al broker il compito di valutare le altre. E' necessario tenere presente tali informazioni per due motivi:
- Le modifiche apparentemente insignificanti alle espressioni della
clausola WHERE possono avere effetti rilevanti sulle prestazioni. E' possibile determinare la quantità di espressione fornita al database
esaminando una traccia utente.
- Alcune funzioni del database operano in modo leggermente diverso rispetto a quelle del broker.
Gestione degli errori
E'
possibile che durante le operazioni di aggiornamento si verifichino degli
errori. Ad esempio, il database potrebbe non essere operativo oppure per la tabella
potrebbero essere definiti dei vincoli che verrebbero violati dai nuovi valori. In tali casi, viene generata un'eccezione (a meno che la proprietà
Genera eccezione in caso di errore database del nodo non sia impostata su FALSE). Tali eccezioni impostano valori di testo dell'errore, dell'errore nativo, dello
stato e del codice SQL e possono essere gestite mediante i programmi di
gestione degli errori (consultare l'istruzione DECLARE HANDLER).
Per ulteriori informazioni relative alla gestione degli errori del
database, consultare Cattura dello stato del database.
Esempi
Nell'esempio seguente si presuppone che la proprietà
dataSource del nodo Database sia stata configurata e che il database identificato contenga una tabella denominata STOCKPRICES, con colonne denominate COMPANY e PRICES. Viene aggiornata la colonna
PRICE delle righe nella tabella
STOCKPRICES la cui colonna COMPANY corrisponde al valore fornito nel campo
Company nel messaggio.
UPDATE Database.StockPrices AS SP
SET PRICE = InputBody.Message.StockPrice
WHERE SP.COMPANY = InputBody.Message.Company
Nel
seguente esempio (che utilizza ipotesi simili), l'espressione della clausola
SET fa riferimento al valore esistente di una colonna e diminuisce il valore di
un'unità nel messaggio:
UPDATE Database.INVENTORY AS INV
SET QUANTITY = INV.QUANTITY - InputBody.Message.QuantitySold
WHERE INV.ITEMNUMBER = InputBody.Message.ItemNumber
Il
seguente esempio aggiorna più colonne:
UPDATE Database.table AS T
SET column1 = T.column1+1,
column2 = T.column2+2;
Notare che i
nomi di colonna (a sinistra del simbolo "=") sono identificativi singoli. Non devono essere qualificati con un nome di tabella o di correlazione. Inoltre, i riferimenti alle colonne del database nelle espressioni (a destra
del simbolo "=") devono essere qualificati con il nome di correlazione.
L'esempio successivo illustra l'utilizzo dei nomi della
tabella, dello schema e dell'origine dati calcolati:
-- Declare variables to hold the data source, schema and table names
-- and set their default values
DECLARE Source CHARACTER 'Production';
DECLARE Schema CHARACTER 'db2admin';
DECLARE Table CHARACTER 'DynamicTable1';
-- Code which calculates their actual values comes here
-- Update rows in the table
UPDATE Database.{Source}.{Schema}.{Table} AS R SET Value = 0;