返回首页

gbase数据、南大通用产品文档:GBase8s禁用消息链接

更新日期:2024年09月11日


GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 199 -
可以选择禁用消息链接。
在禁用消息链接之前,请考虑以下情况:

一些 SQL 语句需要立即回复。如果禁用消息链接,请在限制的 SQL 语句完成后重
新启动 OPTMSG 功能。

如果执行调试。可以在试图确定每个 SQL 语句应答时禁用 OPTMSG 功能。

如果启用 OPTMSG,该消息会在数据库服务器中列队,但是不会发送进行处理。考
虑在程序中的最后一条 SQL 语句之前禁用消息链接,
以确保数据库服务器在应用程
序退出之前处理所有消息。

如果禁用消息链接,必须在需要它的 SQL 语句之后立即重置
SQL_INFX_ATTR_OPTMSG 属性,来避免意外链接。
以下示例显示如何禁用消息链接,通过在 DELETE 语句之后放置
SQL_INFX_ATTR_OPTMSG 属性。如果将该属性放在删除语句后,则驱动程序可以
在下一条 SQL 语句之前时,刷新所有排队的消息:
SQLSetStmtOption(hstmt, SQL_INFX_ATTR_OPTMSG, 1);
SQLExecDirect(hstmt, (unsigned char *)
"delete from customer", SQL_NTS);
SQLSetStmtOption(hstmt, SQL_INFX_ATTR_OPTMSG, 0);
SQLExecDirect(hstmt, (unsigned char *)
"create index ix1 on customer (zipcode)", SQL_NTS);
意外消息链接会使其很难确定哪一个链接的语句失败。
在 CREATE INDEX 语句中,驱动程序将 DELETE 和 CREATE INDEX 语句发送
到数据库服务器。

联合运算使用 UNION 运算符将两个查询组合成单个复合查询。可以在两个或多个
SELECT 语句之间使用 UNION 运算符来产生一个临时表,它包含存在于任何一个原始表
或所有原始表中的行。还可以在视图的定义中使用 UNION 运算符。
不能在下列上下文的子查询内使用 UNION 运算符

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 149 -

在 SELECT 语句的 Projection 子句中

在 SELECT 、INSERT 、DELETE 或 UPDATE 语句的 WHERE 子句中
然而,
UNION 运算符在 SELECT 语句的 FROM 子句中的子查询中是有效的,
如下所示:
SELECT * FROM (SELECT col1 FROM tab1 WHERE col1 = 100) AS vtab1(c1),
(SELECT col1 FROM tab2 WHERE col1 = 10
UNION ALL
SELECT col1 FROM tab1 WHERE col1 < 50 ) AS vtab2(vc1);
GBase 8s 不支持对 ROW 类型进行排序。
由于 UNION 操作需要排序以除去重复值,
所以
当联合运算中的任一查询包括 ROW 类型数据时,不能使用 UNION 操作符。但是,数据
库服务器确实支持具有 ROW 类型数据的 UNION ALL,这是因为此类运算无需排序。
下图举例说明了 UNION 集合运算。
图: 联合集合运算

UNION 关键字选择两个查询中的所有行,
除去重复行并返回余下的行。
因为查询的结果组
合为一个结果,所以每个查询中的投影列表必须具有相同的列数。同时,从每个表选择的
相应列必须包含兼容的数据类型(CHARACTER 数据类型列的长度必须相同),并且这些
相应的列必须全部允许或全部不允许 NULL 值。
有关 SELECT 语句和 UNION 运算符的完整语法,
请参阅
《GBase 8s SQL 指南:
语法》

有关特定于 GBase 8s ESQL/C 产品和涉及 INTO 子句和复合查询的任何限制的信息,请参
阅《GBase 8s ESQL/C 程序员手册》。
下列查询对 stock 和 items 表中的 stock_num 和 manu_code 列执行联合。
图: 查询
SELECT DISTINCT stock_num, manu_code FROM stock
WHERE unit_price < 25.00

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 150 -
UNION
SELECT stock_num, manu_code FROM items
WHERE quantity > 3;
该查询选择单价小于 $25.00 或预订数量大于三的那些商品并列出
其 stock_num 和 manu_code,如下所示。
图: 查询结果
stock_num manu_code

5 ANZ
5 NRG
5 SMT
9 ANZ
103 PRC
106 PRC
201 NKL
301 KAR
302 HRO
302 KAR

将 ORDER BY 子句与 UNION 一起使用
如下列查询所示,
当包括 ORDER BY 子句时,
该子句必须跟在最后的 SELECT 语句后面,
并使用整数(而不是标识)来引用排序的列。排序在集合运算完成之后发生。
图: 查询
SELECT DISTINCT stock_num, manu_code FROM stock
WHERE unit_price < 25.00
UNION
SELECT stock_num, manu_code FROM items
WHERE quantity > 3
ORDER BY 2;
之前的复合查询选择与图 2相同的行但以制造商代码的顺序显示它们,如下所示。
图: 查询结果
stock_num manu_code

5 ANZ
9 ANZ

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 151 -
302 HRO
301 KAR
302 KAR
201 NKL
5 NRG
103 PRC
106 PRC
5 SMT

UNION ALL 关键字
缺省情况下,UNION 关键字排除重复的行。要保留重复值,添加可选关键字 ALL,如下
所示。
图: 查询
SELECT stock_num, manu_code FROM stock
WHERE unit_price < 25.00
UNION ALL
SELECT stock_num, manu_code FROM items
WHERE quantity > 3
ORDER BY 2
INTO TEMP stock item;
该查询使用 UNION ALL 关键字联合两个 SELECT 语句并在最后一个 SELECT 后面添
加 INTO TEMP 子句来将结果放置到临时列表中。它返回与图 1相同的行,但还包括重复
的值。
图: 查询结果
stock_num manu_code

9 ANZ
5 ANZ
9 ANZ
5 ANZ
9 ANZ

5 NRG
5 NRG
103 PRC

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 152 -
106 PRC
5 SMT
5 SMT

使用不同的列名
组合查询的 Projection 子句中相应的列必须具有兼容的数据类型,但各列不需要使用相同
的列名。
下列查询从 customer 表中选择 state 列及 state 表中的相应 code 列。
图: 查询
SELECT DISTINCT state FROM customer
WHERE customer_num BETWEEN 120 AND 125
UNION
SELECT DISTINCT code FROM state
WHERE sname MATCHES '*a';
该查询返回客户号 120 至 125 的州代码缩写以及其 sname 以 a 结束的州的州代码缩写。
图: 查询结果
state

AK
AL
AZ
CA
DE

SD
VA
WV
在复合查询中,
第一个 SELECT 语句中的列名或显示标注就是出现在结果中的列名或显示
标注。因此,在此查询中,使用第一个 SELECT 语句中的列名 state 而不是第一个语句中
的列名 code。

将 UNION 与多个表配合使用
以下查询对三个表执行联合运算。最大联合数取决于应用程序的实用性和任何内存限制。
图: 查询

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 153 -
SELECT stock_num, manu_code FROM stock
WHERE unit_price > 600.00
UNION ALL
SELECT stock_num, manu_code FROM catalog
WHERE catalog_num = 10025
UNION ALL
SELECT stock_num, manu_code FROM items
WHERE quantity = 10
ORDER BY 2;
该查询选择 stock 表中的 unit_price 大于 $600、catalog 表中的 catalog_num 为 10025
或 items 表中的 quantity 为 10 的商品;查询按manu_code 对数据进行排序。该结果显示了
返回值。
图: 查询结果
stock_num manu_code

5 ANZ
9 ANZ
8 ANZ
4 HSK
1 HSK
203 NKL
5 NRG
106 PRC
113 SHM

在 Projection 子句中使用文字
下列查询在投影列表中使用文字来标记联合操作的部分输出,以便今后可以区分它。为该
标记提供标号 sortkey。查询使用 sortkey 来对检索到的行进行排序。
图: 查询
SELECT '1' sortkey, lname, fname, company,
city, state, phone
FROM customer x
WHERE state = 'CA'
UNION
SELECT '2' sortkey, lname, fname, company,

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 154 -
city, state, phone
FROM customer y
WHERE state <> 'CA'
INTO TEMP calcust;
SELECT * FROM calcust
ORDER BY 1;
该查询创建一个列表,在该列表中,来自 California 的客户首先显示。
图: 查询结果
sortkey 1
lname Baxter
fname Dick
company Blue Ribbon Sports
city Oakland
state CA
phone 415-655-0011

sortkey 1
lname Beatty
fname Lana
company Sportstown
city Menlo Park
state CA
phone 415-356-9982

sortkey 2
lname Wallack
fname Jason
company City Sports
city Wilmington
state DE
phone 302-366-7511

使用 FIRST 子句
可以使用 FIRST 子句来选择由联合查询的产生的前几行。以下查询使用 FIRST 子句返
回 stock 和 items 表之间的联合的前五行。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 155 -
图: 查询
SELECT FIRST 5 DISTINCT stock_num, manu_code
FROM stock
WHERE unit_price < 55.00
UNION
SELECT stock_num, manu_code
FROM items
WHERE quantity > 3;
图: 查询结果
stock_num manu_code

5 NRG
5 ANZ
6 SMT
6 ANZ
9 ANZ

ON-Bar 活动日志文件中的消息具有以下格式:
timestamp process_id parent_process_id message
下表描述了消息中的每个字段。ON-Bar 活动日志中没有出现错误消息号。
表 1. ON-Bar 消息格式
消息字段
描述
timestamp
ON-Bar 写入消息的日期和时间。
process_id
操作系统用来标识此 ON-Bar 实例的编号。
parent_process_id 操作系统用来标识执行此 ON-Bar 实例的进程的编号。
message
ON-Bar 消息文本。
以下示例举例说明了 ON-Bar 活动日志中的一个典型条目:
1999-08-18 10:09:59 773 772 已完成逻辑恢复。
重要: 如果收到 XBSA 错误消息,请查阅存储管理器日志获取关于更多详细信息。