La sentencia UPDATE cambia los valores de columnas
específicas, en filas seleccionadas, en una tabla en una base de datos externa.
Todas las filas para las que la
expresión de la cláusula WHERE toma el valor TRUE se actualizan en la
tabla identificada por ReferenciaTabla.
Se examina cada fila a su vez y se establece una
variable que apunta a la fila actual. Normalmente, la expresión de la
cláusula WHERE utiliza esta variable para acceder a los valores de columna
y hacer así que las filas se actualicen o se conserven sin cambios,
según sus contenidos. Se hace referencia a la variable mediante
NombreCorrelación o, si no hay ninguna cláusula AS,
mediante NombreTabla. Cuando se ha seleccionado una
fila para actualizar, a cada columna nombrada en la cláusula SET se le da
un nuevo valor, determinado por la expresión correspondiente. Si lo desea, estas expresiones pueden hacer referencia a la variable de
fila actual.
Referencia de tabla
Una
referencia de tabla es un caso especial de referencias de campo que se
utiliza para hacer referencia a los árboles de mensaje. Siempre empieza con la palabra
"Database" y puede contener cualquiera
de estos elementos:
- Sólo un nombre de tabla
- Un nombre de esquema y un nombre de tabla
- Un nombre de origen de datos (es decir, el nombre de una instancia
de base de datos), un nombre de esquema y un nombre de tabla
En cada caso, el nombre puede especificarse
directamente o mediante una expresión encerrada entre llaves
({...}). Un nombre de origen de datos, esquema o tabla especificado
directamente, puede ser sustituido. Es decir, si el nombre utilizado se
ha declarado como un nombre conocido, se utiliza más bien el valor del nombre
declarado en lugar del nombre mismo
(consulte
Sentencia DECLARE).
Si no se especifica
un nombre de esquema, se utiliza el esquema por omisión para el usuario de
base de datos del intermediario.
Si no se especifica un nombre de origen de datos, se utiliza la base
de datos que indica el atributo data source del nodo.
La cláusula WHERE
La expresión de la cláusula WHERE puede utilizar
cualquier operador y función del intermediario en cualquier combinación. Puede
hacer referencia a columnas de tabla, campos de mensajes y cualquier
constante o variable declarada.
Sin embargo, tenga en
cuenta que el intermediario trata
la expresión de la cláusula WHERE examinando la expresión y decidiendo
si la base de datos puede evaluar toda la expresión.
Si puede, se suministra a la base de datos. Para que pueda evaluarla la base de datos, debe utilizar únicamente las funciones y operadores a los que dé soporte la base de datos.
No obstante, la cláusula WHERE hace referencia a campos de
mensajes, nombres de correlación declarados en las cláusulas
SELECT que las contienen, y a cualquier otra variable o constante
declarada dentro del ámbito.
Si la base de datos no
puede evaluar toda la expresión, el intermediario busca los operadores AND
de nivel superior y examina cada subexpresión por separado. A continuación, intenta proporciona a la base de datos las subexpresiones que puede evaluar, dejando que el intermediario evalúe el resto. Debe tener en cuenta esta situación por dos motivos:
- Los cambios en las expresiones de la cláusula WHERE que aparentemente pueden parecer triviales pueden tener un gran impacto en el rendimiento. Puede determinar la cantidad de la expresión que se ha suministrado a la base de datos examinando un rastreo de usuario.
- Algunas funciones de base de datos se comportan de manera ligeramente
diferente del intermediario.
Manejo de errores
Es
posible que se produzcan errores durante las operaciones de actualización. Por ejemplo, es posible que la base de datos no esté operativa, o la tabla
puede tener limitaciones definidas que los nuevos valores violarían. En estos casos, se genera una excepción (a menos que el nodo tenga su
propiedad Generar excepción en error de base de datos
establecida en FALSE). Estas excepciones establecen los valores SQL adecuados
de código, estado, error nativo y texto de error, y pueden ser
manejadas por los manejadores de errores (consulte la sentencia DECLARE
HANDLER).
Para obtener más información sobre el manejo de errores
de base de datos, consulte
Captura del estado de la base de datos.
Ejemplos
El ejemplo siguiente supone
que se ha configurado la propiedad
dataSource del nodo
Database y que la
base de datos que identifica tiene una tabla denominada STOCKPRICES, con
columnas denominadas COMPANY y PRICES. Actualiza la columna
PRICE de las filas de la tabla STOCKPRICES cuya columna COMPANY coincide con
el valor proporcionado en el campo Company del mensaje.
UPDATE Database.StockPrices AS SP
SET PRICE = InputBody.Message.StockPrice
WHERE SP.COMPANY = InputBody.Message.Company
En
el siguiente ejemplo (que efectúa suposiciones similares), la
expresión de la cláusula SET hace referencia al valor existente de una
columna y reduce el valor en una cantidad en el mensaje:
UPDATE Database.INVENTORY AS INV
SET QUANTITY = INV.QUANTITY - InputBody.Message.QuantitySold
WHERE INV.ITEMNUMBER = InputBody.Message.ItemNumber
El
ejemplo siguiente actualiza varias columnas:
UPDATE Database.table AS T
SET column1 = T.column1+1,
column2 = T.column2+2;
Observe que
los nombres de columna (a la izquierda del signo "=") son identificadores
solos. No deben calificarse con un nombre de tabla o un nombre de
correlación. Por el contrario, las referencias a las columnas de base de
datos en las expresiones (a la derecha del signo "=") deben calificarse
con el nombre de correlación.
El ejemplo siguiente
muestra el uso de nombres calculados de origen de datos, esquema y tabla:
-- Declarar variables para que contengan los nombres de origen de datos, esquema
-- y tabla, y establecer sus valores por omisión
DECLARE Source CHARACTER 'Production';
DECLARE Schema CHARACTER 'db2admin';
DECLARE Table CHARACTER 'DynamicTable1';
-- Aquí va el código que calcula sus valores actuales
-- Actualizar las filas en la tabla
UPDATE Database.{Source}.{Schema}.{Table} AS R SET Value = 0;