A instrução UPDATE altera os valores das colunas especificadas,
em linhas selecionadas, em uma tabela de um banco de dados externo.
Todas as linhas para as quais a expressão da cláusula WHERE
é avaliada como TRUE são atualizadas na tabela identificada por TableReference.
Cada linha é examinada sucessivamente e uma variável é configurada
para apontar para a linha atual. Normalmente, a expressão da cláusula WHERE utiliza essa
variável para acessar valores de colunas e, por conseguinte, fazer com que as linhas sejam
atualizadas, ou mantidas inalteradas, de acordo com o conteúdo. A variável é referida por CorrelationName ou,
na ausência de uma cláusula AS, por TableName. Quando uma linha
é selecionada para atualização, cada coluna nomeada na cláusula SET recebe
um novo valor, conforme determinado pela expressão correspondente. Essas expressões
podem, se você desejar, referir-se à variável de linha atual.
Referência de Tabela
Uma
referência de tabela é um caso especial das referências de campos utilizadas para
referir-se às árvores de mensagens. Ela sempre inicia com a palavra
"Database" e pode
conter um dos seguintes:
- Apenas um nome de tabela.
- Um nome de esquema e um nome de tabela.
- Um nome de origem de dados (ou seja, o nome de uma instância de banco de dados),
um nome de esquema e um nome de tabela.
Em cada caso, o nome pode ser especificado diretamente ou por uma expressão
entre chaves ({...}). Um nome de origem de dados, esquema ou tabela especificado
diretamente está sujeito à substituição de nome. Ou seja, se o nome utilizado tiver sido
declarado como um nome conhecido, o valor do nome declarado será utilizado no lugar do
próprio nome (consulte
Instrução DECLARE).
Se um nome de esquema
não for especificado, será utilizado o esquema padrão para o usuário do banco de dados do intermediário.
Se
um nome de origem de dados não for especificado, será utilizado o banco de dados apontado
pelo atributo origem de dados do nó.
A Cláusula WHERE
A expressão da cláusula WHERE pode utilizar qualquer um dos operadores e
funções do intermediário, em qualquer combinação. Ela pode referir-se a colunas de tabelas,
campos de mensagens e quaisquer variáveis ou constantes declaradas.
Entretanto,
lembre-se que o intermediário trata a expressão da cláusula WHERE, examinando-a
e decidindo se a expressão inteira pode ser avaliada pelo banco de dados.
Se puder, ela será fornecida ao banco de dados.
A fim de ser avaliada pelo banco de dados, ela deve utilizar somente as
funções e os operadores suportados pelo banco de dados.
Entretanto, a cláusula WHERE pode referir-se a campos de mensagens, nomes
de correlação declarados por SELECTs que os contêm e quaisquer outras variáveis ou
constantes declaradas no escopo.
Se expressão inteira não puder ser
avaliada pelo banco de dados, o intermediário procurará operadores AND de primeiro nível
e examinará cada subexpressão separadamente. Em seguida, ele tentará fornecer ao banco de dados essas subexpressões que pode avaliar,
deixando o intermediário avaliar o restante. É necessário estar ciente dessa situação por duas razões:
- Aparentemente, as alterações comuns em expressões da cláusula WHERE podem ter
grandes efeitos no desempenho. Você pode determinar a porcentagem da expressão que
foi fornecida ao banco de dados, examinando um rastreio do usuário.
- Algumas funções dos bancos de dados exibem diferenças sutis de comportamento
em comparação com as funções do intermediário.
Tratamento de erros
É possível que
ocorram erros durante as operações de atualização. Por exemplo, o banco de dados pode
não estar operacional ou a tabela pode ter restrições definidas que os novos
valores violariam. Nestes casos, uma exceção é emitida (a menos que
o nó tenha sua propriedade throw exception on database error configurada
como FALSE). Essas exceções configuram os valores apropriados de código SQL, estado, erro nativo
e texto de erro e podem ser tratadas por rotinas de tratamento de erro (consulte a instrução
DECLARE HANDLER).
Para obter
informações adicionais sobre como manipular erros do banco de dados, consulte Capturando o Estado do Banco de Dados.
Exemplos
O exemplo a seguir supõe
que a propriedade
dataSource do nó Banco de Dados foi configurada
e que o banco de dados identificado por ela possui uma tabela chamada STOCKPRICES,
com colunas chamadas COMPANY e PRICES. Ele atualiza a coluna PRICE das linhas na
tabela STOCKPRICES cuja coluna COMPANY corresponda ao valor especificado no campo
Empresa na mensagem.
UPDATE Database.StockPrices AS SP
SET PRICE = InputBody.Message.StockPrice
WHERE SP.COMPANY = InputBody.Message.Company
No
exemplo a seguir (com premissas similares), a expressão da cláusula SET
refere-se ao valor existente de uma coluna e, por conseguinte, decrementa o valor
por uma quantidade na mensagem:
UPDATE Database.INVENTORY AS INV
SET QUANTITY = INV.QUANTITY - InputBody.Message.QuantitySold
WHERE INV.ITEMNUMBER = InputBody.Message.ItemNumber
O
exemplo a seguir atualiza várias colunas:
UPDATE Database.table AS T
SET column1 = T.column1+1,
column2 = T.column2+2;
Observe que os
nomes das colunas (à esquerda do "=") são identificadores únicos. Eles não devem
ser qualificados com um nome de tabela ou nome de correlação. Em contraste, as referências
às colunas do banco de dados nas expressões (à direita do "=") devem ser qualificadas
com o nome de correlação.
O próximo exemplo mostra a utilização
de nomes de origem de dados, esquema e tabela:
-- Declarar variáveis para conter os nomes de origem de dados, esquema e tabela
-- e configurar seus valores padrão
DECLARE Source CHARACTER 'Production';
DECLARE Schema CHARACTER 'db2admin';
DECLARE Table CHARACTER 'DynamicTable1';
-- O código que calcula seus valores reais fica aqui
-- Atualizar linhas na tabela
UPDATE Database.{Source}.{Schema}.{Table} AS R SET Value = 0;