返回首页

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处理程序才能截获这个异常。

CREATE
SCHEMA 块将两行添加至 sysindexes 系统目录表
(GBase
8s 的 sysindices 表)

这些行对应于对 customer 表创建的索引,如在以下示例中所示。
idxname
c_num_ix
state_ix
owner
maryl
maryl
tabid
101
101
idxtype
U
D

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 11 -

idxname
c_num_ix
state_ix
集群


part1
1
8
part2
0
0
part3
0
0
part4
0
0
part5
0
0
part6
0
0
part7
0
0
part8
0
0
part9
0
0
part10
0
0
part11
0
0
part12
0
0
part13
0
0
part14
0
0
part15
0
0
part16
0
0
levels


leaves


nunique


clust


idxflags



在此表中,idxtype 列标识创建的索引是需要唯一值 (U) 还是接受重复的值 (D)。例
如:customer.customer_num 列的 c_num_ix 索引是唯一的。
如果在执行查询或其他数据操作语言 (DML) 语句之前使用 UPDATE STATISTICS 语句
来更新系统目录,那么可以确保查询执行优化器可用的信息是最新的。
访问系统目录
普通用户对系统目录的访问是只读的。
具有 Connect 或 Resource 特权的用户不能变
更目录,但他们可以使用标准 SELECT 语句以只读方式来访问系统目录表中的数据。
例如,
下面的 SELECT 语句显示数据库中用户创建表的所有表名及对应的 tabid 代码:


GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 12 -

SELECT tabname, tabid FROM systables WHERE tabid > 99
在使用 DB-Access 时,只显示您创建的表。要显示系统目录表,输入以下语句:
SELECT tabname, tabid FROM systables WHERE tabid < 100
可以使用 SUBSTR 或 SUBSTRING 函数来仅选择源字符串的一部分。
要按列显示表的列
表,输入以下语句:
SELECT SUBSTR(tabname, 1, 18), tabid FROM systables
虽然用户 gbasedbt 可以修改大部分系统目录表,但不应该在这些表中更新、删除或
插入任何行。修改系统目录表的内容可能会影响数据库的完整性。然而,您可以安全地使
用 ALTER
TABLE 语句来修改系统目录表的下一个扩展数据块的大小。更改下一个扩展数据
块大小不会影响已存在的扩展数据块。
但是,对于 GBase 8s 的某些目录表,将条目添加至系统目录表是有效的。例如,对
于 syserrors 系统目录表和 systracemsgs 系统目录表,DataBlade
(R) 模块开发者可以直
接插入位于这些系统目录表中的条目。
更新系统目录数据
如果在执行查询或其他数据操作语言 (DML) 语句之前使用 UPDATE STATISTICS 语句
来更新系统目录,那么可以确保查询执行优化器可用的信息是最新的。
在 GBase 8s 中,优化器会为执行 SQL 查询和其他 DML 操作确定最有效的策略。优
化器允许您查询数据库而不必全面考虑要先在连接中搜索哪些表或要使用哪些索引。优化
器使用来自系统目录中的信息以确定最佳查询策略。
当删除或修改表时,数据库服务器不会自动更新系统目录中的相关统计数据。例如:
如果使用 DELETE 语句删除表中的一行或多行,
那么 systables 系统目录表中用于保存该表
行数的 nrows 列不会自动更新。
UPDATE
STATISTICS 语句会让数据库服务器重新计算 systables、
sysdistrib、
syscolumns
和 sysindices 系统目录表中以及 sysindexes 视图中的数据。(对于在 STATLEVEL 属性设
置为 FRAGMENT 的分段表上的操作,
它还会更新 sysfragdist 和 sysfragments 系统目录表。

在运行 UPDATE STATISTICS 之后,systables 系统目录表就在 nrows 列中保存正确的值。
如果在运行 UPDATE
STATISTICS 时指定 MEDIUM 或 HIGH 方式,那么 sysdistrib 表会保存
更新的列分布数据。如果在运行 UPDATE
STATISTICS 时指定 MEDIUM 或 HIGH 方式,那么
sysdistrib 系统目录表会保存更新的列分布数据。
对于分段级别的统计信息,
sysfragdist 系
统目录表会保存更新的列分布数据。
每当对数据表进行大量修改时,使用 UPDATE
STATISTICS 语句来更新系统目录中的数
据。有关 UPDATE STATISTICS 语句的更多信息,请参阅 GBase 8s SQL 指南:语法。

功能说明
GBase 8a MPP Cluster 中使用DECLARE 定义游标,标注的主体一定是一个SE
LECT 语句。
注意

可以在一个程序中定义多个游标,但是每个块中的游标只能有唯一的名
字;

SELECT 语句不能包含有INTO 子句。
语法格式
DECLARE cursor_name CURSOR FOR
表5- 181 参数说明
参数名称


cursor_name
要创建的游标的名称,游标名只允许a~z、A~Z、0~9、下
划线,且不能只包含数字;
select_statement
游标的内容,可以是任何合法的SELECT 语句
示例
DECLARE cur CURSOR FOR SELECT DISTINCT lo_orderkey FROM
ssbm.lineorder ORDER BY lo_orderkey LIMIT 10;