返回首页

gbase数据、南大通用产品文档:GBase8s添加到 sysindexes 或 sysindices 表中的行

更新日期:2024年09月11日

CREATE SCHEMA 块将两行添加至 sysindexes 系统目录表(GBase 8s 的 sysindices
表)。这些行对应于对 customer 表创建的索引,如在以下示例中所示。
idxname
c_num_ix
state_ix
owner
maryl
maryl

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 12 -
idxname
c_num_ix
state_ix
tabid
101
101
idxtype
U
D
集群


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 特权的用户不能

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 13 -
变更目录,但他们可以使用标准 SELECT 语句以只读方式来访问系统目录表中的数据。
例如,下面的 SELECT 语句显示数据库中用户创建表的所有表名及对应的 tabid 代
码:
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 语句来更新系统目录中的

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 14 -
数据。有关 UPDATE STATISTICS 语句的更多信息,请参阅 GBase 8s SQL 指南:语法。

下列 GBase 8s ESQL/C 示例检索 DECIMAL 列的平均值,
其自身是 DECIMAL 值。
然而,
将 DECIMAL 列的平均值放置其内的主变量不要求具有那种数据类型。
EXEC SQL SELECT avg (total_price) into :avg_price
FROM items;
不展示在前面的 GBase 8s ESQL/C 代码示例中接收的变量 avg_price 的声明。
该声明可为任
一下列定义:
int avg_price;
double avg_price;
char avg_price[16];
dec_t avg_price; /* typedef of decimal number structure */
注释语句中使用的每一主变量的数据类型,并使用该语句传到数据库服务器。数据库服务
器尽量将列数据转换为接收的变量使用的形式。允许几乎任何转换,尽管某些转换会导致
精度损失。依赖于接收的主变量的数据类型,前面的示例的结果会不同,如下表所示。
数据类型
结果
FLOAT
数据库服务器将十进制结果转换为 FLOAT,可能截断某些小数位。如果

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 213 -
数据类型
结果
十进制的数量超过 FLOAT 格式的最大数量,则返回一个错误。
INTEGER
数据库服务器将结果转换为 INTEGER,如有必要会截断小数位。如果被
转换的数值的整数部分与接收的变量不适合,则发生错误。
CHARACTER
数据库服务器将十进制值转换为 CHARACTER 字符串。
如果对于接收的变
量来说该字符串太长,则截断它。将 SQLWARN 的第二个字段设置为 W,
且 SQLSTATE 变量中的值为 01004。

SQLTablePrivileges 返回表和与每个表相关的特权的列表。
驱动程序将此信息作为指定 hstmt 上的结果集。
下表描述了 SQLTablePrivileges 的 SQLSTATE 和错误值。
SQLSTATE
错误值
错误消息
01000
-11001
General warning
08S01
-11020
Communication-link failure
24000
-11031
Invalid cursor state
S1000
-11060
General error
S1001
-11061
Memory-allocation failure
S1008
-11065
Operation canceled
S1010
-11067
Function-sequence error
S1090
-11071
Invalid string or buffer length
S1C00
-11092
Driver not capable
S1T00
-11094
Time-out expired

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

SQLSTATE
错误值
错误消息
S1C00
-11300
SQL_DEFAULT_PARAM not supported
08S01
-11301
A protocol error has been detected. Current connection is
closed.
S1000
-11310
Create and Drop must be executed within a ServerOnly
Connection
S1000
-11320
Syntax error
S1000
-11323
The statement contained an escape clause not supported by
this database driver