返回首页

gbase数据、南大通用产品文档:GBase8s显示逻辑日志记录

更新日期:2024年09月11日

使用 onlog 实用程序显示并解释逻辑日志记录有关使用 onlog 的信息,请参阅
《GBase 8s 管理员参考》。

虽然定位更新不适用于所有类型的应用程序,但尽可能使用定位更新和删除。
定位更新(使用 UPDATE WHERE CURRENT OF CURSOR)允许您通过将数据库游标定
位到要更改的行来更新数据,并通知驱动程序更改数据。您不必强制构建复杂的 SQL 语
句;提供要更改的语句。
除了要使代码更易于维护,定位更新通常会提高性能。由于数据库服务器已经在行上定位
(对于当前正在处理 SELECT 语句),因此定位要更改的行的多余查询是不必要的。如果
该行必须定位,则数据库服务器通常具有指向可用行的内部指针(例如 ROWID)。
要支持使用滚动游标定位的 UPDATE 和 DELETE 语句,GBase 8s ODBC Driver 从原始
的定位语句构造一个新的搜索的 UPDATE 或 DELETE 语句。
但是,
数据库服务器不能直
接更新滚动游标。相反,GBase 8s ODBC Driver 会构造一个 WHERE 子句,用于引用在

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 197 -
WHERE CURRENT OF CURSOR 子句中引用的 SELECT 语句中访存的每个列。SELECT
语句的行集数据缓存中的值绑定到已经建立的 WHERE 子句中的每个值。
该定位方法比使用具有 FORWARD ONLY 游标的子句 WHERE CURRENT OF CURSOR
子句更慢,更容易出错。如果访存的行不包含唯一键值,则构建的 WHERE 子句可能标识
一行或多行,
这会导致许多行被删除和更新。
以这种方式删除行会影响定位的 UPDATE 和
DELETE 语句,和使用滚动游标的 SQLSetPos 语句。
使用 SQLSpecialColumns 确定在 WHERE 子句中用于更新数据的最佳列集。很多时候,
伪列提供了对数据的最快访问;您只能通过使用 SQLSpecialColumns 确定这些列。
许多应用程序不能设计为利用定位的更新和删除。
这些应用程序通常通过形成 WHERE 子
句来更新数据。该 WHERE 子句由结果集中返回的一部分列值组成。某些应用程序可能会
使用所有可搜索的结果列或通过调用 SQLStatistics 来查找可能属于唯一索引的列的
WHERE 子句。这些方法通常有效,但是会导致相当复杂的查询。
考虑以下示例:
rc = SQLExecDirect (hstmt, "SELECT first_name, last_name, ssn,
address, city, state, zip FROM emp", SQL_NTS);
// fetchdata

rc = SQLExecDirect (hstmt, "UPDATE EMP SET ADDRESS = ?
WHERE first_name = ? AND last_name = ? AND ssn = ? AND
address = ? AND city = ? AND state = ? AND zip = ?", SQL_NTS);
// fairly complex query
应用程序应该调用 SQLSpecialColumns/SQL_BEST_ROWID 检索标识任何给定记录的最
佳列集(可能是伪列)。许多数据库支持在表定义中没有显式用户定义的特定列,但是是
每个表的隐藏列(例如,ROWID 、TID 和其它列)。这些伪列总是提供对数据的最快访
问。因为它们通常指向记录的确切位置。因为伪列不是显式表定义的一部分,所以它们不
会从 SQLSpecialColumns 返回。确定伪列是否存在的唯一方法是调用 SQLSpecialColumns。

考虑之前的示例,这次使用 SQLSpecialColumns:

rc = SQLSpecialColumns (hstmt, ..... 'emp', ...);

rc = SQLExecDirect (hstmt, "SELECT first_name, last_name, ssn,
address, city, state, zip, ROWID FROM emp", SQL_NTS);
// fetch data and probably "hide" ROWID from the user

rc = SQLExecDirect (hstmt, "UPDATE emp SET address = ? WHERE
ROWID = ?", SQL_NTS);
// fastest access to the data!

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 198 -
如果您的数据源不包含特定的伪列,则 SQLSpecialColumns的结果集由指定表上的最佳唯
一索引组成(如果唯一索引存在)。因此,您的应用程序不会另外调用 SQLStatistics 来查
找最小的唯一索引。

返回集合可以拥有的最大元素个数,如果没有上限返回NULL,因此只有可变数组有
意义。
CREATE OR REPLACE PROCEDURE P_5_25 AS
TYPE aa_type IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
aa aa_type; -- associative array
TYPE va_type IS VARRAY(4) OF INTEGER;
va va_type := va_type(2,4); -- varray
TYPE nt_type IS TABLE OF INTEGER;

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

nt nt_type := nt_type(1,3,5); -- nested table
BEGIN
aa(1):=3; aa(2):=6; aa(3):=9; aa(4):= 12;
DBMS_OUTPUT.PUT('aa.COUNT = ');
DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(aa.COUNT), 'NULL'));
DBMS_OUTPUT.PUT('aa.LIMIT = ');
DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(aa.LIMIT), 'NULL'));
DBMS_OUTPUT.PUT('va.COUNT = ');
DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(va.COUNT), 'NULL'));
DBMS_OUTPUT.PUT('va.LIMIT = ');
DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(va.LIMIT), 'NULL'));
DBMS_OUTPUT.PUT('nt.COUNT = ');
DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(nt.COUNT), 'NULL'));
DBMS_OUTPUT.PUT('nt.LIMIT = ');
DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(nt.LIMIT), 'NULL'));
END;

--Result:
--aa.COUNT = 4
--aa.LIMIT = NULL
--va.COUNT = 2
--va.LIMIT = 4
--nt.COUNT = 3
--nt.LIMIT = NULL