8在外部数据库中访问和修改数据
8.1访问其他数据库服务器
通过限定数据库对象(表、视图、同义词或例程)的名称,您可访问外部数据库中的任何 表或例程。
当外部表与当前数据库位于同一数据库服务器上时,您必须以数据库名称和冒号限定对象 名称。例如,要引用不是本地数据库的数据库中的表,下列SELECT语句访问来自外部数 据库的信息:
SELECT name, number FROM salesdb:contacts
在此示例中,查询从表contacts返回数据,该表在数据库salesdb中。
远程数据库服务器是不是当前数据库服务器的任何数据库服务器。当外部表在远程数据库 服务器上时,您必须以数据库服务器名称和数据库名称来限定数据库对象的名称,如下例 所示:
SELECT name, number FROM salesdb@distantserver:contacts
在此示例中,查询从表contacts返回数据,该表在远程数据库服务器distantserver上的数 据库salesdb中。
要了解关于如何在外部数据库中指定数据库对象的语法和规则,请参阅《GBase 8s SQL指 南:语法》。
8.1.1访问ANSI数据库
在ANSI数据库中,对象的所有者是对象名称的一部分:ownername.objectname。当当前 数据库和外部数据库都是ANSI数据库时,除非您是该对象的所有者,否则您必须包括 所有者名称。下列SELECT语句展示完全限定的表名称:
SELECT name, number FROM salesdb@aserver:ownername.contacts
提示:您始终可“超限定”对象名。即,您可指定完全的对象名称, database@servername:ownername.objectname,即使在您不需要完全的对象名称的情况下。
8.1.2在外部数据库服务器之间创建连接
您可在连接中使用相同的表示法。当您显式地指定数据库名称时,长的表名称可能会比较 累赘,除非您使用别名来缩短它们,如下例所示:
SELECT O.order_num, C.fname, C.lname
FROM masterdb@central:customer C, sales@boston:orders O
WHERE C.customejnum = O.Customejnum
8.1.3访问外部例程
要引用不是当前数据库服务器的数据库服务器上的例程,请以数据库服务器名称和数据库 名称(以及所有者名称,如果远程数据库符合ANSI的话)来限定例程名称,如下列 SELECT语句所示:
SELECT name, salesdb@boston:how_long()
FROM salesdb@boston:contacts
8.2对于远程数据库访问的限制
本部分总结对远程数据库访问的限制。
8.2.1访问多个数据库的SQL语句
您可跨数据库和跨数据库服务器实例运行下列SQL语句:
CREATE DATABASE
CREATE SYNONYM
CREATE VIEW
DATABASE
DELETE
DROP DATABASE
EXECUTE FUNCTION
EXECUTE PROCEDURE
INFO
INSERT
LOAD
LOCK TABLE
MERGE
SELECT
UNLOAD
UNLOCK TABLE
UPDATE
限制:
要跨数据库或跨数据库服务器成功地运行这些SQL语句中的每一个,本地数据库与外部 数据库必须都具有相同的日志记录模式。例如,如果作为MODE ANSI创建了您从其发出
分布式查询的本地数据库,该查询访问的其他数据库都不可为无日志记录的,且不可使用 显式的事务。
在跨数据库操作中返回数据类型
使用SQL语句或UDR来访问本地GBase 8s数据库服务器实例的其他数据库的分布式 操作可访问这些数据类型的值:
非opaque的任何内建的原子数据类型
BLOB、BOOLEAN, BSON、CLOB、JSON 和 LVARCHAR opaque 类型
基于内建的类型的DISTINCT类型
•可强制转型为内建的类型的用户定义的数据类型(U DT)。
必须将上述DISTINCT或UDT值都显式地强制转型为内建的数据类型,且必须在所有参 与的数据库中定义所有DISTINCT类型、UDT和强制转型。
它们还可访问可强制转型为内建的类型的UDT,假设显式地将DISTINCT或UDT值强 制转型为内建的类型,以及在所有参与的数据库中定义的所有DISTINCT类型、UDT和 强制转型。
如果在所有参与的数据库中定义UDR,则SPL、C和Java语言UDR可返回这些数据 类型作为参数或作为返回值。必须跨所有参与的GBase 8s实例,来复制在这些数据类型之 上定义的任何隐式的或显式的强制转型。DISTINCT数据类型必须具有与在分布式查询中 参与的所有数据库中定义的完全相同的数据类型层级结构。
跨数据库的分布式查询或其他访问本地GBase 8s数据库服务器的另一数据库的跨数据库 DML操作将会失败并报错,如果它引用包括任何下列数据类型的列的表、视图或同义词的 话:
IMPEX
IMPEXBIN
LOLIST
SENDRECV
以上列出的任何内建的opaque数据类型的DISTINCT
复合的类型,包括COLLECTION、LIST、MULTISET或SET,以及命名了的或 未命名的ROW类型。
对于以这些内建的opaque或复合的数据类型访问表的跨数据库分布式操作的这一限制, 也适用于访问两个或多个数据库服务器实例的数据库的操作,这在下一部分描述。
在跨服务器操作中的返回数据类型
跨两个或多个GBase 8s实例的分布式查询(或任何其他分布式DML操作或函数调用)不 可返回复合的或大对象数据类型,也不可返回大部分UDT或opaque数据类型。跨服务 器分布式查询、DML操作和函数调用仅可返回下列数据类型:
•任何非opaque的内建数据类型
BOOLEAN
BSON
JSON
LVARCHAR
非opaque的内建类型的DISTINCT
BOOLEAN 或 LVARCHAR 的 DISTINCT
BSON 或 JSON 的 DISTINCT
在此列表中出现在上面的任何DISTINCT类型的DISTINCT o
同样的跨数据库要求也适用于跨两个或多个GBase 8s数据库服务器实例的数据库的分布 式SQL操作,即,在每个参与的数据库中,所有UDR、强制转型和DISTINCT数据类 型都要有相同的定义。
访问另一 GBase 8s实例的数据库的跨服务器DML操作将会失败并报错。然而,如果它引 用包括任意下列数据类型的表对象:
BLOB
CLIENTBINVAL
CLOB
IFX_LO_SPEC
IFX_LO_STAT
INDEXKEYARRAY
POINTER
RTNPARAMTYPES
SELFUNCARGS
STAT
•用户定义的OPAQUE类型
罗列在上面的任何内建的opaque数据类型的DISTINCT
复合的类型,包括COLLECTION、LIST、MULTISET或SET,以及命名了的或 未命名的ROW类型。
————————————————
版权声明:本文为CSDN博主「aisirea」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aisirea/article/details/122999798