#dblink

dblink::=

syntax
@ dblink_name

该语法用于YashanDB(源端)对远端数据库(目的端)的表操作,目的端可以为同构数据库(YashanDB)或异构数据库(Oracle)。

dblink_name指在CREATE DATABASE LINK时所创建的远端数据库名称。

# 使用说明

  • 通过dblink操作远端数据库的表时,需满足如下要求:

    Note:

    在分布式部署中,操作远端表时采用列存,除下表所列数据类型要求外,还应遵循列存的数据类型支持范围

    目的端为Oracle 目的端为YashanDB
    需先安装libaio库和下载Oracle Instant Client安装包 -
    远端表字段需为下列数据类型:
    SMALLINT
    INT
    FLOAT/BINARY_FLOAT
    BINARY_DOUBLE
    NUMBER/DECIMAL
    DATE
    TIMESTAMP
    INTERVAL YEAR TO MONTH
    INTERVAL DAY TO SECOND
    CHAR
    VARCHAR
    NCHAR
    NVARCHAR
    VARCHAR2
    NVARCHAR2
    RAW
    BLOB(源端为分布式部署时,不适用)
    CLOB(源端为分布式部署时,不适用)
    NCLOB(源端为分布式部署时,不适用)
    TIMESTAMP WITH TIME ZONE(源端为分布式部署时,不适用)
    TIMESTAMP WITH LOCAL TIME ZONE(源端为分布式部署时,不适用)
    远端表字段需为下列数据类型:
    TINYINT
    SMALLINT
    INT
    BIGINT
    FLOAT/BINARY_FLOAT
    DOUBLE/BINARY_DOUBLE
    NUMBER
    BIT
    BOOLEAN
    DATE
    TIME
    TIMESTAMP
    INTERVAL YEAR TO MONTH
    INTERVAL DAY TO SECOND
    CHAR
    VARCHAR
    RAW
    ROWID(源端为分布式部署时,不适用)
  • 在分布式部署中,无法对远端数据库的表进行INSERT、UPDATE、DELETE、SEQUENCE、PROCEDURE以及FUNCTION操作。

  • 在使用dblink的场景下,不支持通过二阶段提交(Two-phase Commit)保证所有资源同时提交或回滚某个事务。

  • 暂未适配临时表,如若对远端临时表进行操作,结果可能与预期不符。

# 查询远端表

对远端表进行SELECT操作时,存在如下约束:

  • 不能采用table.column@dblink形式。
  • 单次最多查询32个远端表。

示例

-- 创建远端表
conn sys/sys
CREATE TABLE table_test(c1 INT);

-- 创建dblink,并访问远端表
conn sales/sales
CREATE DATABASE link link_test CONNECT TO sys IDENTIFIED BY sys USING '192.168.1.2:1688';
SELECT * FROM table_test@link_test;

-- 更改远端表的元数据
conn sys/sys
ALTER TABLE table_test ADD COLUMN c2;

conn sales/sales

SELECT * FROM table_test@link_test;
C1           C2          
------------ ------------

# 插入远端表

对远端表进行INSERT操作时,存在如下约束:

  • 不允许多表INSERT。
  • 不允许指定分区INSERT。
  • 不允许执行INSERT DUPLICATE UPDATE语句。
  • 不允许执行INSERT RETURN语句。
  • INSERT SELECT不支持LOB类型。

示例(单机、共享集群部署)

-- 创建远端表
conn sys/sys
CREATE TABLE table_test(c1 INT, c2 INT);

-- 创建dblink,并访问远端表
conn sales/sales
CREATE DATABASE link link_test CONNECT TO sys IDENTIFIED BY sys USING '192.168.1.2:1688';
SELECT * FROM table_test@link_test;

-- 插入数据
INSERT INTO table_test@link_test VALUES(1,2);

# 更新远端表

对远端表进行UPDATE操作时,存在如下约束:

  • filter与更新本地数据库的对象的filter相比:
    • 不能使用聚集函数。
    • 不能使用窗口函数。
    • 不能使用子查询。
    • 不能使用序列。
    • 不能使用自定义函数(包括UPDATE SET语句)。
  • 不允许多表UPDATE。
  • 不允许指定分区UPDATE。

示例(单机、共享集群部署)

-- 创建远端表
conn sys/sys
CREATE TABLE table_test(c1 INT, c2 INT);

-- 创建dblink
conn sales/sales
CREATE DATABASE link link_test CONNECT TO sys IDENTIFIED BY sys USING '192.168.1.2:1688';

-- 更改远端表的元数据
conn sys/sys
UPDATE table_test@linktest SET c1=1,c2=2;

# 删除远端表

对远端表进行DELETE操作时,存在如下约束:

  • filter与删除本地数据库的对象的filter相比:
    • 不能使用聚集函数。
    • 不能使用窗口函数。
    • 不能使用子查询。
    • 不能使用序列。
    • 不能使用自定义函数。
  • 不允许多表DELETE。
  • 不允许指定分区DELETE。

示例(单机、共享集群部署)

conn sys/sys
CREATE TABLE table_test(c1 INT);

-- 创建dblink
conn sales/sales
CREATE DATABASE link link_test CONNECT TO sys IDENTIFIED BY sys USING '192.168.1.2:1688';

-- 删除远端表数据
DELETE FROM table_test@link_test WHERE c1=1;