UPDATE 语句

UPDATE 语句更改外部数据库的表中的选定行中指定列的值。

语法

WHERE 子句表达式求值结果为 TRUE 的所有行都在 TableReference 标识的表中更新。每一行都会依次检查,且变量会设置为指向当前行。通常,WHERE 子句表达式使用此变量来访问列值,以根据行的内容来更新行或保留行不变。变量由 CorrelationName,或者在没有 AS 子句的情况下由 TableName 引用。当为更新选定了行,根据相应表达式,将赋予 SET 子句中每个命名的列一个新值。如果需要,这些表达式可以引用当前行变量。

Table 引用

表引用是用于引用消息树的字段引用的特殊情况。它始终以单词“Database”开始,并可以包含以下任何内容:
  • 仅表名称
  • 模式名称和表名
  • 数据源名称(即,数据库实例的名称)、模式名称和表名
在每种情况中,可以直接指定名称,或通过括在花括号({...})中的表达式进行指定。直接指定的数据源、模式或表的名称遵守名称替代。即,所用名称如果已声明为已知名称,则会使用已声明名称的值而不是名称本身(请参阅DECLARE 语句)。

如果未指定模式名称,则使用代理的数据库用户的缺省模式。

如果未指定数据源名称,则使用节点的 data source 属性指向的数据库。

WHERE 子句

WHERE 子句表达式可以使用代理的任何运算符和函数的任何组合。这些表达式可以引用表列、消息字段以及任何声明的变量或常量。

但是,代理检查 WHERE 子句表达式并确定整个表达式是否能被数据库求值来处理该表达式。如果可以,就将此表达式交给数据库。为了能被数据库求值,表达式必须只使用数据库支持的函数和运算符。

但是,WHERE 子句可以引用消息字段、通过包含 SELECT 声明的相关名以及作用域中的任何其他声明的变量或常量。

如果整个表达式无法由数据库进行求值,则代理查找顶级 AND 运算符并分别检查每个子表达式。然后代理尝试将数据库可以求值的子表达式交给数据库,把其他子表达式留给自己求值。由于以下两个原因,您需要了解这种情况:
  1. WHERE 子句表达式的微小更改显然可以对性能造成很大影响。您可以通过检查用户跟踪信息决定把多少表达式交给数据库。
  2. 某些数据库函数的行为与代理函数的行为有细微的差别。

处理错误

更新操作过程中可能会发生错误。例如,数据库可能不可操作,或者表上可能定义了新值将违例的约束。在这些情况下,除非节点将其数据库发生错误时抛出异常属性设置为 FALSE,否则将抛出异常。这些异常设置相应的 SQL 代码、状态、本机错误和错误文本值,并且可以由错误处理程序来处理(请参阅 DECLARE HANDLER 语句)。

有关处理数据库错误的更多信息,请参阅捕获数据库状态

示例

以下示例假设已配置了 Database 节点的 dataSource 属性,且其标识的数据库有 STOCKPRICES 表,该表中有 COMPANY 和 PRICES 列。它更新 STOCKPRICES 表中行的 PRICE 列,表的 COMPANY 列匹配消息中的 Company 字段中给定的值。
UPDATE Database.StockPrices AS SP
 SET PRICE = InputBody.Message.StockPrice
 WHERE SP.COMPANY = InputBody.Message.Company
在以下示例(作类似的假设)中,SET 子句表达式引用现有的列值,以便将该值减少消息中的量:
UPDATE Database.INVENTORY AS INV
 SET QUANTITY = INV.QUANTITY - InputBody.Message.QuantitySold
 WHERE INV.ITEMNUMBER = InputBody.Message.ItemNumber
以下示例更新多个列:
UPDATE Database.table AS T
  SET column1 = T.column1+1,
     column2 = T.column2+2;

注意:列名(在“=”的左边)是单个标识。它们不得用表名或相关名限定。相反,表达式(在“=”的右边)中对数据库列的引用必须用相关名限定。

下一个示例显示使用计算数据源、模式和表名称:
-- 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;
相关概念
ESQL 概述
相关任务
正在开发 ESQL
捕获数据库状态
相关参考
语法图:可用类型
ESQL 语句
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ak05160_