|
复合 SQL
何时使用复合 SQL
SQL 语句通常要逐句执行。这使得编程更加容易,但是也意味着必须在客户机和服务器之间传送每个语句和每个结果集。为了减少应用程序所生成的网络流量,可以将多个 SQL 语句编为一个组。这个组则称作复合 SQL(compound SQL)。复合 SQL 通常用在服务器端对象中,比如存储过程和用户定义的函数,也用在嵌入式 SQL 应用程序中。
有两种类型的复合 SQL:原子的(atomic)和非原子的(non-atomic)。
对于原子的 SQL,当所有子语句成功完成时,或者当某个子语句失败时,应用程序会从数据库管理器接收一个响应。如果一个子语句失败,那么会将整个组视作失败,该组中对数据库所做的任何更改都被回滚。
对于非原子的 SQL,当所有子语句完成时,应用程序会从数据库管理器接收一个响应。无论前一子语句是否成功完成,组中的每个子语句都会执行。只有在回滚包含非原子复合 SQL 的工作单元时,才可以回滚该语句组。
复合 SQL:优点和缺点
使用复合 SQL 有一些优点:
- 可以减少网络流量,因为只会传送最初的 SQL 块和最终的结果集。
- 可以提高应用程序的整体速度,因为更多工作是在服务器而不是客户机上执行的。
但是,使用复合 SQL 也有一些缺点:
- 只能从执行的整个 SQL 语句组接收一条错误消息。
- 如果发生错误,就无法判断是哪个 SQL 语句失败了。
图 3 是一个使用复合 SQL 造成网络流量下降的示例。更多的线表示更大的网络流量。网络流量的下降完全依靠复合 SQL 中 SELECT、INSERT、UPDATE 和 DELETE 语句的平衡。 图 3. 网络流量:用和不用复合 SQL
在下列几种情况下,建议使用复合 SQL:
- 将在 SQL 语句块中来回发送大量数据。使用复合 SQL 可以减少网络流量。
- 您有一个反应迟缓的客户机,但是希望利用高速的服务器。使用复合 SQL 可以确保在服务器上进行处理,并仅将最后的结果发送回客户机。
使用复合 SQL
复合语句块以 BEGIN 关键字开始,并以 END 关键字结束。以下是一个示例:
BEGIN ATOMIC
UPDATE employee
SET salary = salary * 1.1
WHERE edlevel > 12;
UPDATE dept
SET budget = budget * 0.8
WHERE profitMargin > 10;
INSERT INTO deptList (empno,salary)
VALUES (SELECT empno,salary
FROM employee WHERE edlevel = 15);
END
|
如果以上的复合语句在第一个 UPDATE 语句就失败了,将无法判断是哪个语句失败了。构造这个复合语句的优点是,发送给服务器并返回的数据仅仅是 SQL 语句和最后的 SQL 返回码。 |