返回首页

gbase数据、南大通用产品文档:GBase8s标准 SQL

更新日期:2024年09月11日

由于性能或竞争优势等原因,或者为了利用本地硬件或软件功能,每个 SQL 实现都与其
它实现以及 GBase 版本的语言有些小的区别。
为了确保这些差异不会增大,
在二十世纪八
十年代早期成立了标准委员会。
由美国国家标准学会(ANSI)资助的委员会 X3H2 在 1986 年发布了 SQL1 标准。此标
准定义了一组核心的 SQL 功能和诸如 SELECT 等语句的语法。

bar_instance 表包含备份的每个对象的描述。
ON-Bar 为每个成功的备份向 bar_instance 表中写入一条记录。ON-Bar 可能稍后使用该信
息进行恢复操作。例如:如果指定 2 级备份,ON-Bar将使用该表以确保先前已成功执行
1 级备份。
表 1. bar_instance 表列
列名
类型
解释
ins_aid
INTEGER
操作标识。标识创建该备份对象实例的成功操
作。可以与 ins_oid 结合起来用于连接
bar_action 表。

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 107 -

列名
类型
解释
ins_oid
INTEGER
对象标识。标识受影响的对象。 可以用于连
接 bar_object 表。 可以与 ins_aid 结合
起来用于连接 bar_action 表。
ins_prevtime
INTEGER
时间戳记(实时时间)。此值指定先前对象的时
间戳记。此值代表 1970 年 1 月 1 日 午夜
(格林威治标准时间)以后的秒数。
ins_time
INTEGER
时间戳记(实时时钟时间)。数据库服务器创建
下级备份时将使用该值。该值代表自 1970 年 1
月 1 日 午夜(格林威治标准时间)以来的秒
数。
ins_time 的值是 0。
rsam_time
INTEGER
备份检查点时间戳记。不是时钟时间。数据库服
务器创建下级备份时使用该值。
ins_level
SMALLINT
备份操作的级别:0 表示完整备份,1 表示自上
次 0 级备份以来对该对象所做的所有更改的备
份,2 表示自上次 1 级备份以来所有更改的备
份。 对于逻辑日志备份,该值始终是 0。
ins_copyid_hi
INTEGER
实例副本标识的高位。它是存储管理器分配的唯
一值,与 ins_copyid_lo 结合在一起,用于
将 ON-Bar 对象标识与存储管理器对象标识连
接在一起。
ins_copyid_lo
INTEGER
实例副本标识的低位。它是存储管理器分配的唯
一值,与 ins_copyid_hi 结合在一起,用于
将 ON-Bar 对象标识与存储管理器对象标识连
接在一起。
ins_req_aid
INTEGER
存储备份对象必需的操作标识。在恢复中使用,
以确定与 1 级备份相伴的 0 级备份,以及与 2
级备份相伴的 1 级备份。对于 0 级备份,

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 108 -

列名
类型
解释
ins_req_aid 的值与表中 ins_aid的值相同。
例如:如果备份是 1 级的,ins_req_aid 保留
该对象相应的 0 级备份的操作标识。
ins_first_log
INTEGER
在标准备份中,标识从该备份恢复必需的第一个
逻辑日志。
ins_verify
INTEGER
如果备份已验证则该值为 1。如果备份未验证则
该值为 0。
ins_verify_date DATETIME YEAR TO
SECOND
验证备份时插入当前日期。如果该备份尚未验
证,那么用短划线表示每个日期和时间。

在形式上,
动态 SQL 语句像任何其他写入程序的 SQL 语句一样,
除了它不可包含任何主
变量的名称之外。
准备好的 SQL 语句有两个限制。首先,如果它是 SELECT 语句,则它不可包括
INTO variable 子句。INTO variable 子句指定将列数据放入其内的主变量,而不允许在准备
好的对象的文本中使用主变量。
其次,
不论主变量的名称通常出现在表达式中的任何位置,
都将问号(?)写作 PREPARE 语句中的占位符。仅 PREPARE 语句可指定问号(?)占位
符。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 224 -
您可使用 PREPARE 语句以此形式为执行准备语句。
使用 GBase 8s ESQL/C编写下列示例:

EXEC SQL prepare query_2 from
'SELECT * from orders
WHERE customer_num = ? and order_date > ?';
此示例中的两个问号指示当执行该语句时,在那两个位置使用主变量的值。
您可动态地准备几乎任何 SQL 语句。
您唯一不可准备的语句就是与动态 SQL 和游标管理
直接相关联的语句,
诸如 PREPARE 和 OPEN 语句。
在您准备 UPDATE 或 DELETE 语
句之后,最好测试 SQLWARN 的第五个字段来查看您是否使用了 WHERE 子句(请参
阅 SQLWARN 数组)。
准备语句的结果是表示该语句的数据结构。此数据结构与产生它的字符串不一样。在
PREPARE 语句中,您赋予该数据结构一个名称;它是前面示例中的 query_2。使用此名称
来执行准备好的 SQL 语句。
PREPARE 语句不将字符串限制于一个语句。
它可包含多个用分号分隔的 SQL 语句。
下列
示例展示用 GBase 8s ESQL/C 编写的相当复杂的事务:
strcpy(big_query, "UPDATE account SET balance = balance + ?
WHERE customer_id = ?; \ UPDATE teller SET balance =
balance + ? WHERE teller_id = ?;");
EXEC SQL PREPARE big1 FROM :big_query;
当执行此语句的列表时,主变量必须为六个占位的问号提供值。虽然设置多语句列表更为
复杂,但由于在程序与数据库服务器之间发生更少的交换,因此性能往往更好。