返回首页

gbase数据、南大通用产品文档:GBase8s异常如何传播

更新日期:2024年09月11日

当引发异常时,如果PL/SQL在当前块或子程序中找不到该异常的处理程序,则异常会
向上传播。也就是说,异常在层层父块中复制自身,直到找到一个处理程序为止。如果最
后也找不到处理程序,PL/SQL将向主机环境返回一个未处理的异常错误。
下图说明了基本的传播规则。

GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 126 -


子块中抛出的异常A在子块中就被截获并处理了,此时控制权交给了父块。

子块中抛出的异常B在父块中被截获并处理了,此时控制权交给了外部环境。

GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 127 -


子块中抛出的异常C没有被截获,因此返回给执行环境一个错误:未处理的异常。
异常可以传播到其作用域之外,也就是说,在声明它的块之外。 例如:
BEGIN
DECLARE ---------- 子块开始
past_due EXCEPTION; --子块中声明的异常
due_date DATE := trunc(SYSDATE) - 1;
todays_date DATE := trunc(SYSDATE);
BEGIN
IF due_date < todays_date THEN
RAISE past_due; --抛出异常past_due
END IF;
END; ------------- 子块结束
EXCEPTION
WHEN OTHERS THEN -- 处理异常
ROLLBACK;
END;
由于声明异常past_due的块没有处理异常,因此异常将传播到父块。但是,父块不能
引用past_due的名称,因为它声明的范围不再存在。一旦异常名称不再存在,只有
OTHERS处理程序才能截获这个异常。


GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 49 -

GBase 8s 数据库服务器使用 SQL 数据类型。
要获取关于 GBase 8s SQL 数据类型的详尽信息,请参阅《GBase 8s SQL 指南:参考》、
《GBase 8s SQL 指南:教程》和 《GBase 8s 用户定义的例程和数据类型开发者指南》 。

功能说明
UPDATE 时,不能更新自增列。
示例
create table t2(a int auto_increment primary key,b varchar(100), c int)
distributed by ('b');

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1034
insert into t2(b,c) values('a1',1),('a2',2),('a3',3),('a4',4),('a5',5);
gbase> SELECT * FROM t2;
+---+------+------+
| a | b
| c
|
+---+------+------+
| 3 | a2
|
2 |
| 1 | a3
|
3 |
| 2 | a1
|
1 |
| 6 | a5
|
5 |
| 4 | a4
|
4 |
+---+------+------+
5 rows in set (Elapsed: 00:00:00.02)
gbase> update t2 set c = 144 where b = 'a2';
Query OK, 1 row affected (Elapsed: 00:00:00.08)
Rows matched: 1
Changed: 1
Warnings: 0
gbase> update t2 set a = 441 where b = 'a2';
ERROR 1235 (42000): This version of GBase doesn't yet support 'update/merge on
auto_increment column'
gbase> SELECT * from t2;
+---+------+------+
| a | b
| c
|
+---+------+------+
| 1 | a3
|
3 |
| 3 | a2
|
144 |

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1035
| 2 | a1
|
1 |
| 6 | a5
|
5 |
| 4 | a4
|
4 |
+---+------+------+
5 rows in set (Elapsed: 00:00:00.02)