1.3.2.12. 其他

1.3.2.12.1. GoldenDB-Mysql

1.3.2.12.1.1. PROMPT 命令

语法

PROMPT 文本内容

警告

目标库不支持该命令,因此通过配置参数,config/unisql.conf中unisql.global.replace.sql参数可配置需要替换的sql语句。 使用前需要开启unisql.splitsql.transform.multisql参数为1

示例

-- 转换前ORACLE SQL:
PROMPT ==============================
PROMPT  订单表分区创建脚本 v1.0
PROMPT  创建人:XXX
PROMPT  创建时间:2025-12-04
PROMPT ==============================
PROMPT 开始执行表创建逻辑...

-- 转换后GoldenDB-Mysql SQL(unisql.global.replace.sql = 'select 1'):
select 1;
select 1;
select 1;
select 1;
select 1;
select 1

1.3.2.12.1.2. rownum

  • 支持 >, >=, =, <=, < 操作符

  • 支持别名

示例

-- 转换前ORACLE SQL:
select a, rownum as row_count from t where rownum >= 10 and rownum <= 10

-- 转换后GoldenDB-Mysql SQL
-- 和原语句保持一致

1.3.2.12.1.3. all_indexes视图

语法

支持
OWNER,
INDEX_NAME,
INDEX_TYPE,
TABLE_OWNER,
TABLE_NAME,
TABLE_TYPE,
UNIQUENESS列

警告

  • 目标库创建后的OWNER, INDEX_NAME, INDEX_TYPE, TABLE_OWNER, TABLE_NAME默认为小写,为了和oracle保持一致使用all_indexes视图时,都转成了大写

  • 索引名称未指定时,两边库自动生成的索引名称不一致

  • 主键索引目标库为 PRIMARY

  • INDEX_TYPE,两边库特性不一样因此有些不一致

  • OWNER 字段在目标库中仅仅指的是数据库名称,目标库可指用户或模式名称;

  • 在oracle是查询当前用户有权限的对象,goldendb_mysql那边information_schema.all_*无论有无权限都查询出来。所以使用需要加上owner过滤条件,否则目标库查询出来的会多很多。

示例

CREATE TABLE test_20251216_1 (
    dept_id    NUMBER(4)       NOT NULL,  -- 部门ID(非空)
    dept_name  VARCHAR2(50)    NOT NULL,  -- 部门名称(非空)
    create_time DATE DEFAULT SYSDATE,     -- 创建时间(默认当前时间)
    -- 主键约束(命名约束,推荐显式命名便于维护)
    CONSTRAINT pk_dept PRIMARY KEY (dept_id),
    -- 唯一约束(部门名称不能重复)
    CONSTRAINT uk_dept_name UNIQUE (dept_name),
    -- 检查约束(部门ID必须大于0)
    CONSTRAINT ck_dept_id CHECK (dept_id > 0)
);

CREATE TABLE test_20251216_2 (
    -- 基础字段定义
    emp_id     NUMBER(6)       NOT NULL,  -- 员工ID(非空约束,列级)
    emp_name   VARCHAR2(100)   NOT NULL,  -- 员工姓名(非空)
    email      VARCHAR2(100),             -- 邮箱
    phone      VARCHAR2(20),              -- 手机号
    dept_id    NUMBER(4),                 -- 所属部门(关联dept表)
    salary     NUMBER(8,2),               -- 薪资
    hire_date  DATE,                      -- 入职日期
    gender     CHAR(1),                   -- 性别(男/女)
    is_active  VARCHAR2(1) DEFAULT 'Y',   -- 是否在职(默认Y)

    -- 主键约束
    CONSTRAINT pk_emp PRIMARY KEY (emp_id),
    -- 唯一约束
    CONSTRAINT uk_emp_email UNIQUE (email),
    CONSTRAINT uk_emp_phone UNIQUE (phone),
    -- 外键约束(Oracle仅支持ON DELETE,不支持ON UPDATE)
    CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id)
        REFERENCES test_20251216_1 (dept_id)
        ON DELETE SET NULL,  -- 仅保留ON DELETE SET NULL(Oracle支持)
    -- 检查约束(薪资必须大于0)
    CONSTRAINT ck_emp_salary CHECK (salary > 0)
);


CREATE INDEX idx_emp_name ON test_20251216_2 (emp_name);
CREATE INDEX idx_emp_dept_hire ON test_20251216_2 (dept_id, hire_date);
CREATE BITMAP INDEX idx_emp_gender ON test_20251216_2 (gender);
CREATE BITMAP INDEX idx_emp_is_active ON test_20251216_2 (is_active);


-- 转换前ORACLE SQL:
select * from all_indexes WHERE owner=upper('UNISQL_TEST') AND TABLE_NAME = upper('test_20251216_2');
OWNER      |INDEX_NAME       |INDEX_TYPE|TABLE_OWNER|TABLE_NAME     |TABLE_TYPE|UNIQUENESS|
-----------+-----------------+----------+-----------+---------------+----------+----------+
UNISQL_TEST|PK_EMP           |NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
UNISQL_TEST|UK_EMP_EMAIL     |NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
UNISQL_TEST|UK_EMP_PHONE     |NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
UNISQL_TEST|IDX_EMP_NAME     |NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
UNISQL_TEST|IDX_EMP_DEPT_HIRE|NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
UNISQL_TEST|IDX_EMP_GENDER   |BITMAP    |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
UNISQL_TEST|IDX_EMP_IS_ACTIVE|BITMAP    |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |

-- 转换后GoldenDB-Mysql SQL:
SELECT * FROM unisql.all_indexes WHERE owner=upper('UNISQL_TEST') AND TABLE_NAME=upper('test_20251216_2');
OWNER      |INDEX_NAME       |INDEX_TYPE|TABLE_OWNER|TABLE_NAME     |TABLE_TYPE|UNIQUENESS|
-----------+-----------------+----------+-----------+---------------+----------+----------+
UNISQL_TEST|IDX_EMP_DEPT_HIRE|MULTIPLE  |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
UNISQL_TEST|IDX_EMP_GENDER   |MULTIPLE  |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
UNISQL_TEST|IDX_EMP_IS_ACTIVE|MULTIPLE  |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
UNISQL_TEST|IDX_EMP_NAME     |MULTIPLE  |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
UNISQL_TEST|PRIMARY          |PRIMARY   |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
UNISQL_TEST|UK_EMP_EMAIL     |UNIQUE    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
UNISQL_TEST|UK_EMP_PHONE     |UNIQUE    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |

1.3.2.12.1.4. user_indexes视图

语法

支持
INDEX_NAME,
INDEX_TYPE,
TABLE_OWNER,
TABLE_NAME,
TABLE_TYPE,
UNIQUENESS列

警告

  • 目标库创建后的INDEX_NAME, INDEX_TYPE, TABLE_OWNER, TABLE_NAME默认为小写,为了和oracle保持一致使用user_indexes视图时,都转成了大写

  • 索引名称未指定时,两边库自动生成的索引名称不一致

  • 主键索引目标库为 PRIMARY

  • INDEX_TYPE,两边库特性不一样因此有些不一致

  • 需要保证用户名和数据库名相同,会将当前的数据库名当作用户名;

  • 只能查询到有权限的表

示例

CREATE TABLE test_20251216_1 (
    dept_id    NUMBER(4)       NOT NULL,  -- 部门ID(非空)
    dept_name  VARCHAR2(50)    NOT NULL,  -- 部门名称(非空)
    create_time DATE DEFAULT SYSDATE,     -- 创建时间(默认当前时间)
    -- 主键约束(命名约束,推荐显式命名便于维护)
    CONSTRAINT pk_dept PRIMARY KEY (dept_id),
    -- 唯一约束(部门名称不能重复)
    CONSTRAINT uk_dept_name UNIQUE (dept_name),
    -- 检查约束(部门ID必须大于0)
    CONSTRAINT ck_dept_id CHECK (dept_id > 0)
);

CREATE TABLE test_20251216_2 (
    -- 基础字段定义
    emp_id     NUMBER(6)       NOT NULL,  -- 员工ID(非空约束,列级)
    emp_name   VARCHAR2(100)   NOT NULL,  -- 员工姓名(非空)
    email      VARCHAR2(100),             -- 邮箱
    phone      VARCHAR2(20),              -- 手机号
    dept_id    NUMBER(4),                 -- 所属部门(关联dept表)
    salary     NUMBER(8,2),               -- 薪资
    hire_date  DATE,                      -- 入职日期
    gender     CHAR(1),                   -- 性别(男/女)
    is_active  VARCHAR2(1) DEFAULT 'Y',   -- 是否在职(默认Y)

    -- 主键约束
    CONSTRAINT pk_emp PRIMARY KEY (emp_id),
    -- 唯一约束
    CONSTRAINT uk_emp_email UNIQUE (email),
    CONSTRAINT uk_emp_phone UNIQUE (phone),
    -- 外键约束(Oracle仅支持ON DELETE,不支持ON UPDATE)
    CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id)
        REFERENCES test_20251216_1 (dept_id)
        ON DELETE SET NULL,  -- 仅保留ON DELETE SET NULL(Oracle支持)
    -- 检查约束(薪资必须大于0)
    CONSTRAINT ck_emp_salary CHECK (salary > 0)
);


CREATE INDEX idx_emp_name ON test_20251216_2 (emp_name);
CREATE INDEX idx_emp_dept_hire ON test_20251216_2 (dept_id, hire_date);
CREATE BITMAP INDEX idx_emp_gender ON test_20251216_2 (gender);
CREATE BITMAP INDEX idx_emp_is_active ON test_20251216_2 (is_active);


-- 转换前ORACLE SQL:
select * from user_indexes WHERE TABLE_NAME = upper('test_20251216_2');
INDEX_NAME       |INDEX_TYPE|TABLE_OWNER|TABLE_NAME     |TABLE_TYPE|UNIQUENESS|
-----------------+----------+-----------+---------------+----------+----------+
PK_EMP           |NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
UK_EMP_EMAIL     |NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
UK_EMP_PHONE     |NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
IDX_EMP_NAME     |NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_DEPT_HIRE|NORMAL    |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_GENDER   |BITMAP    |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_IS_ACTIVE|BITMAP    |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |

-- 转换后GoldenDB-Mysql SQL:
SELECT * FROM unisql.user_indexes WHERE TABLE_NAME=upper('test_20251216_2');
INDEX_NAME       |INDEX_TYPE|TABLE_OWNER|TABLE_NAME     |TABLE_TYPE|UNIQUENESS|
-----------------+----------+-----------+---------------+----------+----------+
IDX_EMP_DEPT_HIRE|MULTIPLE  |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_GENDER   |MULTIPLE  |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_IS_ACTIVE|MULTIPLE  |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_NAME     |MULTIPLE  |UNISQL_TEST|TEST_20251216_2|TABLE     |NONUNIQUE |
PRIMARY          |PRIMARY   |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
UK_EMP_EMAIL     |UNIQUE    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |
UK_EMP_PHONE     |UNIQUE    |UNISQL_TEST|TEST_20251216_2|TABLE     |UNIQUE    |

1.3.2.12.1.5. user_tables视图

语法

支持
TABLE_NAME ,
TABLESPACE_NAME ,
CLUSTER_NAME ,
IOT_NAME ,
STATUS列

警告

  • 目标库创建后的TABLE_NAME , TABLESPACE_NAME , CLUSTER_NAME , IOT_NAME默认为小写,为了和oracle保持一致使用user_tables视图时,都转成了大写

  • TABLESPACE_NAME,两边库特性不一样因此不一致

  • 需要保证用户名和数据库名相同,会将当前的数据库名当作用户名;

  • 只能查询到有权限的表

示例

CREATE TABLE test_20251216_1 (
    dept_id    NUMBER(4)       NOT NULL,  -- 部门ID(非空)
    dept_name  VARCHAR2(50)    NOT NULL,  -- 部门名称(非空)
    create_time DATE DEFAULT SYSDATE,     -- 创建时间(默认当前时间)
    -- 主键约束(命名约束,推荐显式命名便于维护)
    CONSTRAINT pk_dept PRIMARY KEY (dept_id),
    -- 唯一约束(部门名称不能重复)
    CONSTRAINT uk_dept_name UNIQUE (dept_name),
    -- 检查约束(部门ID必须大于0)
    CONSTRAINT ck_dept_id CHECK (dept_id > 0)
);

CREATE TABLE test_20251216_2 (
    -- 基础字段定义
    emp_id     NUMBER(6)       NOT NULL,  -- 员工ID(非空约束,列级)
    emp_name   VARCHAR2(100)   NOT NULL,  -- 员工姓名(非空)
    email      VARCHAR2(100),             -- 邮箱
    phone      VARCHAR2(20),              -- 手机号
    dept_id    NUMBER(4),                 -- 所属部门(关联dept表)
    salary     NUMBER(8,2),               -- 薪资
    hire_date  DATE,                      -- 入职日期
    gender     CHAR(1),                   -- 性别(男/女)
    is_active  VARCHAR2(1) DEFAULT 'Y',   -- 是否在职(默认Y)

    -- 主键约束
    CONSTRAINT pk_emp PRIMARY KEY (emp_id),
    -- 唯一约束
    CONSTRAINT uk_emp_email UNIQUE (email),
    CONSTRAINT uk_emp_phone UNIQUE (phone),
    -- 外键约束(Oracle仅支持ON DELETE,不支持ON UPDATE)
    CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id)
        REFERENCES test_20251216_1 (dept_id)
        ON DELETE SET NULL,  -- 仅保留ON DELETE SET NULL(Oracle支持)
    -- 检查约束(薪资必须大于0)
    CONSTRAINT ck_emp_salary CHECK (salary > 0)
);


CREATE INDEX idx_emp_name ON test_20251216_2 (emp_name);
CREATE INDEX idx_emp_dept_hire ON test_20251216_2 (dept_id, hire_date);
CREATE BITMAP INDEX idx_emp_gender ON test_20251216_2 (gender);
CREATE BITMAP INDEX idx_emp_is_active ON test_20251216_2 (is_active);


-- 转换前ORACLE SQL:
select * from user_tables WHERE TABLE_NAME = upper('test_20251216_2');
TABLE_NAME     |TABLESPACE_NAME|CLUSTER_NAME|IOT_NAME|STATUS|
---------------+---------------+------------+--------+------+
TEST_20251216_2|USERS          |            |        |VALID |

-- 转换后GoldenDB-Mysql SQL:
select * from unisql.user_tables WHERE TABLE_NAME = upper('test_20251216_2');
TABLE_NAME     |TABLESPACE_NAME            |CLUSTER_NAME|IOT_NAME|STATUS|
---------------+---------------------------+------------+--------+------+
TEST_20251216_2|unisql_test/test_20251216_2|            |        |VALID |

1.3.2.12.1.6. all_tab_columns视图

语法

支持
OWNER ,
TABLE_NAME ,
COLUMN_NAME ,
DATA_TYPE,
DATA_TYPE_MOD,
DATA_TYPE_OWNER,
DATA_LENGTH ,
DATA_PRECISION,
CHAR_LENGTH 列

警告

  • 目标库创建后的OWNER ,TABLE_NAME , COLUMN_NAME , DATA_TYPE, DATA_TYPE_MOD, DATA_TYPE_OWNER默认为小写,为了和oracle保持一致使用all_tab_columns视图时,都转成了大写

  • OWNER 字段在目标库中仅仅指的是数据库名称,目标库可指用户或模式名称;

  • 在oracle是查询当前用户有权限的对象,goldendb_mysql那边information_schema.all_*无论有无权限都查询出来。所以使用需要加上owner过滤条件,否则目标库查询出来的会多很多。

  • DATA_TYPE通过统一sql转换后类型不一致,使用时需要注意,如下:

    Oracle DATA_TYPE

    统一SQL转换后DATA_TYPE

    自定义all_tab_columns视图中DATA_TYPE

    BINARY_FLOAT

    float

    FLOAT

    BINARY_DOUBLE

    double

    DOUBLE

    BLOB

    longblob

    LONGBLOB

    CLOB

    longtext

    LONGTEXT

    NCLOB

    longtext

    LONGTEXT

    CHAR

    char

    CHAR

    CHARACTER

    char

    CHAR

    DATE

    datetime

    DATETIME

    TIMESTAMP

    timestamp

    TIMESTAMP

    DECIMAL

    decimal

    DECIMAL

    DEC

    dec

    DECIMAL

    NUMBER

    decimal

    DECIMAL

    NUMERIC

    numeric

    DECIMAL

    DOUBLE PRECISION

    double

    DOUBLE

    FLOAT

    float

    DOUBLE

    REAL

    real

    DOUBLE

    INTEGER

    bigint

    BIGINT

    INT

    bigint

    BIGINT

    SMALLINT

    bigint

    BIGINT

    LONG

    mediumtext

    MEDIUMTEXT

    LONG RAW

    longblob

    LONGBLOB

    NCHAR

    nchar

    CHAR

    NCHAR VARYING

    nvarchar

    VARCHAR

    NVARCHAR2

    nvarchar

    VARCHAR

    RAW

    varbinary

    VARBINARY

    VARCHAR

    varchar

    VARCHAR

    VARCHAR2

    varchar

    VARCHAR

    BFILE

    不支持

    TIMESTAMP(n) WITH TIME ZONE

    不支持

    TIMESTAMP(n) WITH LOCAL TIME ZONE

    不支持

    INTERVAL YEAR(n) TO MONTH

    不支持

    INTERVAL DAY(p) TO SECOND(s)

    不支持

    ROWID

    不支持

    UROWID(n)

    不支持

    XMLTYPE

    不支持

  • DATA_LENGTH列的「物理存储最大字节数」不一致,oracle中VARCHAR2(100) 的DATA_LENGTH为100(字节),goldendb-mysql中VARCHAR(100)的DATA_LENGTH为400(字节)utf8mb4

  • DATA_PRECISION列的「精度」,针对于oracle中NUMBER(s,p)定义了s精度则相等,没有定义精度直接是NUMBER的和其他类型则不相等。

  • CHAR_LENGTH列的「最大存储最大字符数」不一致,可以根据配置文件中unisql.char.length.factor的配置结果(n)选择转化后目标库的CHAR_LENGTH(实际字节数)/n 后向下取整。

示例

CREATE TABLE test_20251216_1 (
    dept_id    NUMBER(4)       NOT NULL,  -- 部门ID(非空)
    dept_name  VARCHAR2(50)    NOT NULL,  -- 部门名称(非空)
    create_time DATE DEFAULT SYSDATE,     -- 创建时间(默认当前时间)
    -- 主键约束(命名约束,推荐显式命名便于维护)
    CONSTRAINT pk_dept PRIMARY KEY (dept_id),
    -- 唯一约束(部门名称不能重复)
    CONSTRAINT uk_dept_name UNIQUE (dept_name),
    -- 检查约束(部门ID必须大于0)
    CONSTRAINT ck_dept_id CHECK (dept_id > 0)
);

CREATE TABLE test_20251216_2 (
    -- 基础字段定义
    emp_id     NUMBER(6)       NOT NULL,  -- 员工ID(非空约束,列级)
    emp_name   VARCHAR2(100)   NOT NULL,  -- 员工姓名(非空)
    email      VARCHAR2(100),             -- 邮箱
    phone      VARCHAR2(20),              -- 手机号
    dept_id    NUMBER(4),                 -- 所属部门(关联dept表)
    salary     NUMBER(8,2),               -- 薪资
    hire_date  DATE,                      -- 入职日期
    gender     CHAR(1),                   -- 性别(男/女)
    is_active  VARCHAR2(1) DEFAULT 'Y',   -- 是否在职(默认Y)

    -- 主键约束
    CONSTRAINT pk_emp PRIMARY KEY (emp_id),
    -- 唯一约束
    CONSTRAINT uk_emp_email UNIQUE (email),
    CONSTRAINT uk_emp_phone UNIQUE (phone),
    -- 外键约束(Oracle仅支持ON DELETE,不支持ON UPDATE)
    CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id)
        REFERENCES test_20251216_1 (dept_id)
        ON DELETE SET NULL,  -- 仅保留ON DELETE SET NULL(Oracle支持)
    -- 检查约束(薪资必须大于0)
    CONSTRAINT ck_emp_salary CHECK (salary > 0)
);


CREATE INDEX idx_emp_name ON test_20251216_2 (emp_name);
CREATE INDEX idx_emp_dept_hire ON test_20251216_2 (dept_id, hire_date);
CREATE BITMAP INDEX idx_emp_gender ON test_20251216_2 (gender);
CREATE BITMAP INDEX idx_emp_is_active ON test_20251216_2 (is_active);


-- 转换前ORACLE SQL:
select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION,CHAR_LENGTH from all_tab_columns WHERE owner=upper('UNISQL_TEST') AND TABLE_NAME = upper('test_20251216_2');
OWNER      |TABLE_NAME     |COLUMN_NAME|DATA_TYPE|DATA_TYPE_MOD|DATA_TYPE_OWNER|DATA_LENGTH|DATA_PRECISION|CHAR_LENGTH|
-----------+---------------+-----------+---------+-------------+---------------+-----------+--------------+-----------+
UNISQL_TEST|TEST_20251216_2|EMP_ID     |NUMBER   |             |               |         22|             6|          0|
UNISQL_TEST|TEST_20251216_2|EMP_NAME   |VARCHAR2 |             |               |        100|              |        100|
UNISQL_TEST|TEST_20251216_2|EMAIL      |VARCHAR2 |             |               |        100|              |        100|
UNISQL_TEST|TEST_20251216_2|PHONE      |VARCHAR2 |             |               |         20|              |         20|
UNISQL_TEST|TEST_20251216_2|DEPT_ID    |NUMBER   |             |               |         22|             4|          0|
UNISQL_TEST|TEST_20251216_2|SALARY     |NUMBER   |             |               |         22|             8|          0|
UNISQL_TEST|TEST_20251216_2|HIRE_DATE  |DATE     |             |               |          7|              |          0|
UNISQL_TEST|TEST_20251216_2|GENDER     |CHAR     |             |               |          1|              |          1|
UNISQL_TEST|TEST_20251216_2|IS_ACTIVE  |VARCHAR2 |             |               |          1|              |          1|

-- 转换后GoldenDB-Mysql SQL:
-- unisql.conf中 unisql.char.length.factor = 1(默认值)
select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION,CHAR_LENGTH from unisql.all_tab_columns WHERE owner=upper('UNISQL_TEST') AND TABLE_NAME = upper('test_20251216_2');
OWNER      |TABLE_NAME     |COLUMN_NAME|DATA_TYPE|DATA_TYPE_MOD|DATA_TYPE_OWNER|DATA_LENGTH|DATA_PRECISION|CHAR_LENGTH|
-----------+---------------+-----------+---------+-------------+---------------+-----------+--------------+-----------+
UNISQL_TEST|TEST_20251216_2|EMP_ID     |DECIMAL  |             |               |          3|             6|          7|
UNISQL_TEST|TEST_20251216_2|EMP_NAME   |VARCHAR  |             |               |        400|             0|        400|
UNISQL_TEST|TEST_20251216_2|EMAIL      |VARCHAR  |             |               |        400|             0|        400|
UNISQL_TEST|TEST_20251216_2|PHONE      |VARCHAR  |             |               |         80|             0|         80|
UNISQL_TEST|TEST_20251216_2|DEPT_ID    |DECIMAL  |             |               |          2|             4|          5|
UNISQL_TEST|TEST_20251216_2|SALARY     |DECIMAL  |             |               |          4|             8|         10|
UNISQL_TEST|TEST_20251216_2|HIRE_DATE  |DATETIME |             |               |          5|             0|         19|
UNISQL_TEST|TEST_20251216_2|GENDER     |CHAR     |             |               |          4|             0|          4|
UNISQL_TEST|TEST_20251216_2|IS_ACTIVE  |VARCHAR  |             |               |          4|             0|          4|

-- 转换后GoldenDB-Mysql SQL:
-- unisql.conf中 unisql.char.length.factor = 3
select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION,CHAR_LENGTH from unisql.all_tab_columns_utf8 WHERE owner=upper('UNISQL_TEST') AND TABLE_NAME = upper('test_20251216_2');
OWNER      |TABLE_NAME     |COLUMN_NAME|DATA_TYPE|DATA_TYPE_MOD|DATA_TYPE_OWNER|DATA_LENGTH|DATA_PRECISION|CHAR_LENGTH|
-----------+---------------+-----------+---------+-------------+---------------+-----------+--------------+-----------+
UNISQL_TEST|TEST_20251216_2|EMP_ID     |DECIMAL  |             |               |          3|             6|          2|
UNISQL_TEST|TEST_20251216_2|EMP_NAME   |VARCHAR  |             |               |        400|             0|        133|
UNISQL_TEST|TEST_20251216_2|EMAIL      |VARCHAR  |             |               |        400|             0|        133|
UNISQL_TEST|TEST_20251216_2|PHONE      |VARCHAR  |             |               |         80|             0|         26|
UNISQL_TEST|TEST_20251216_2|DEPT_ID    |DECIMAL  |             |               |          2|             4|          1|
UNISQL_TEST|TEST_20251216_2|SALARY     |DECIMAL  |             |               |          4|             8|          3|
UNISQL_TEST|TEST_20251216_2|HIRE_DATE  |DATETIME |             |               |          5|             0|          6|
UNISQL_TEST|TEST_20251216_2|GENDER     |CHAR     |             |               |          4|             0|          1|
UNISQL_TEST|TEST_20251216_2|IS_ACTIVE  |VARCHAR  |             |               |          4|             0|          1|

-- 转换后GoldenDB-Mysql SQL:
-- unisql.conf中 unisql.char.length.factor = 4
select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION,CHAR_LENGTH from unisql.all_tab_columns_utf8mb4 WHERE owner=upper('UNISQL_TEST') AND TABLE_NAME = upper('test_20251216_2');
OWNER      |TABLE_NAME     |COLUMN_NAME|DATA_TYPE|DATA_TYPE_MOD|DATA_TYPE_OWNER|DATA_LENGTH|DATA_PRECISION|CHAR_LENGTH|
-----------+---------------+-----------+---------+-------------+---------------+-----------+--------------+-----------+
UNISQL_TEST|TEST_20251216_2|EMP_ID     |DECIMAL  |             |               |          3|             6|          1|
UNISQL_TEST|TEST_20251216_2|EMP_NAME   |VARCHAR  |             |               |        400|             0|        100|
UNISQL_TEST|TEST_20251216_2|EMAIL      |VARCHAR  |             |               |        400|             0|        100|
UNISQL_TEST|TEST_20251216_2|PHONE      |VARCHAR  |             |               |         80|             0|         20|
UNISQL_TEST|TEST_20251216_2|DEPT_ID    |DECIMAL  |             |               |          2|             4|          1|
UNISQL_TEST|TEST_20251216_2|SALARY     |DECIMAL  |             |               |          4|             8|          2|
UNISQL_TEST|TEST_20251216_2|HIRE_DATE  |DATETIME |             |               |          5|             0|          4|
UNISQL_TEST|TEST_20251216_2|GENDER     |CHAR     |             |               |          4|             0|          1|
UNISQL_TEST|TEST_20251216_2|IS_ACTIVE  |VARCHAR  |             |               |          4|             0|          1|

1.3.2.12.1.7. user_tab_columns视图

语法

支持
TABLE_NAME ,
COLUMN_NAME ,
DATA_TYPE,
DATA_TYPE_MOD,
DATA_TYPE_OWNER,
DATA_LENGTH ,
DATA_PRECISION列

警告

  • 目标库创建后的TABLE_NAME , COLUMN_NAME , DATA_TYPE, DATA_TYPE_MOD, DATA_TYPE_OWNER默认为小写,为了和oracle保持一致使用user_tab_columns视图时,都转成了大写

  • 需要保证用户名和数据库名相同,会将当前的数据库名当作用户名;

  • 只能查询到有权限的表

  • DATA_TYPE通过统一sql转换后类型不一致,使用时需要注意,如下:

    Oracle DATA_TYPE

    统一SQL转换后DATA_TYPE

    自定义all_tab_columns视图中DATA_TYPE

    BINARY_FLOAT

    float

    FLOAT

    BINARY_DOUBLE

    double

    DOUBLE

    BLOB

    longblob

    LONGBLOB

    CLOB

    longtext

    LONGTEXT

    NCLOB

    longtext

    LONGTEXT

    CHAR

    char

    CHAR

    CHARACTER

    char

    CHAR

    DATE

    datetime

    DATETIME

    TIMESTAMP

    timestamp

    TIMESTAMP

    DECIMAL

    decimal

    DECIMAL

    DEC

    dec

    DECIMAL

    NUMBER

    decimal

    DECIMAL

    NUMERIC

    numeric

    DECIMAL

    DOUBLE PRECISION

    double

    DOUBLE

    FLOAT

    float

    DOUBLE

    REAL

    real

    DOUBLE

    INTEGER

    bigint

    BIGINT

    INT

    bigint

    BIGINT

    SMALLINT

    bigint

    BIGINT

    LONG

    mediumtext

    MEDIUMTEXT

    LONG RAW

    longblob

    LONGBLOB

    NCHAR

    nchar

    CHAR

    NCHAR VARYING

    nvarchar

    VARCHAR

    NVARCHAR2

    nvarchar

    VARCHAR

    RAW

    varbinary

    VARBINARY

    VARCHAR

    varchar

    VARCHAR

    VARCHAR2

    varchar

    VARCHAR

    BFILE

    不支持

    TIMESTAMP(n) WITH TIME ZONE

    不支持

    TIMESTAMP(n) WITH LOCAL TIME ZONE

    不支持

    INTERVAL YEAR(n) TO MONTH

    不支持

    INTERVAL DAY(p) TO SECOND(s)

    不支持

    ROWID

    不支持

    UROWID(n)

    不支持

    XMLTYPE

    不支持

  • DATA_LENGTH列的「物理存储最大字节数」不一致,oracle中VARCHAR2(100) 的DATA_LENGTH为100(字节),goldendb-mysql中VARCHAR(100)的DATA_LENGTH为400(字节)utf8mb4

  • DATA_PRECISION列的「精度」,针对于oracle中NUMBER(s,p)定义了s精度则相等,没有定义精度直接是NUMBER的和其他类型则不相等。

  • CHAR_LENGTH列的「最大存储最大字符数」不一致,可以根据配置文件中unisql.char.length.factor的配置结果(n)选择转化后目标库的CHAR_LENGTH(实际字节数)/n 后向下取整。

示例

CREATE TABLE test_20251216_1 (
    dept_id    NUMBER(4)       NOT NULL,  -- 部门ID(非空)
    dept_name  VARCHAR2(50)    NOT NULL,  -- 部门名称(非空)
    create_time DATE DEFAULT SYSDATE,     -- 创建时间(默认当前时间)
    -- 主键约束(命名约束,推荐显式命名便于维护)
    CONSTRAINT pk_dept PRIMARY KEY (dept_id),
    -- 唯一约束(部门名称不能重复)
    CONSTRAINT uk_dept_name UNIQUE (dept_name),
    -- 检查约束(部门ID必须大于0)
    CONSTRAINT ck_dept_id CHECK (dept_id > 0)
);

CREATE TABLE test_20251216_2 (
    -- 基础字段定义
    emp_id     NUMBER(6)       NOT NULL,  -- 员工ID(非空约束,列级)
    emp_name   VARCHAR2(100)   NOT NULL,  -- 员工姓名(非空)
    email      VARCHAR2(100),             -- 邮箱
    phone      VARCHAR2(20),              -- 手机号
    dept_id    NUMBER(4),                 -- 所属部门(关联dept表)
    salary     NUMBER(8,2),               -- 薪资
    hire_date  DATE,                      -- 入职日期
    gender     CHAR(1),                   -- 性别(男/女)
    is_active  VARCHAR2(1) DEFAULT 'Y',   -- 是否在职(默认Y)

    -- 主键约束
    CONSTRAINT pk_emp PRIMARY KEY (emp_id),
    -- 唯一约束
    CONSTRAINT uk_emp_email UNIQUE (email),
    CONSTRAINT uk_emp_phone UNIQUE (phone),
    -- 外键约束(Oracle仅支持ON DELETE,不支持ON UPDATE)
    CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id)
        REFERENCES test_20251216_1 (dept_id)
        ON DELETE SET NULL,  -- 仅保留ON DELETE SET NULL(Oracle支持)
    -- 检查约束(薪资必须大于0)
    CONSTRAINT ck_emp_salary CHECK (salary > 0)
);


CREATE INDEX idx_emp_name ON test_20251216_2 (emp_name);
CREATE INDEX idx_emp_dept_hire ON test_20251216_2 (dept_id, hire_date);
CREATE BITMAP INDEX idx_emp_gender ON test_20251216_2 (gender);
CREATE BITMAP INDEX idx_emp_is_active ON test_20251216_2 (is_active);


-- 转换前ORACLE SQL:
select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION,CHAR_LENGTH from user_tab_columns WHERE TABLE_NAME = upper('test_20251216_2');
TABLE_NAME     |COLUMN_NAME|DATA_TYPE|DATA_TYPE_MOD|DATA_TYPE_OWNER|DATA_LENGTH|DATA_PRECISION|CHAR_LENGTH|
---------------+-----------+---------+-------------+---------------+-----------+--------------+-----------+
TEST_20251216_2|EMP_ID     |NUMBER   |             |               |         22|             6|          0|
TEST_20251216_2|EMP_NAME   |VARCHAR2 |             |               |        100|              |        100|
TEST_20251216_2|EMAIL      |VARCHAR2 |             |               |        100|              |        100|
TEST_20251216_2|PHONE      |VARCHAR2 |             |               |         20|              |         20|
TEST_20251216_2|DEPT_ID    |NUMBER   |             |               |         22|             4|          0|
TEST_20251216_2|SALARY     |NUMBER   |             |               |         22|             8|          0|
TEST_20251216_2|HIRE_DATE  |DATE     |             |               |          7|              |          0|
TEST_20251216_2|GENDER     |CHAR     |             |               |          1|              |          1|
TEST_20251216_2|IS_ACTIVE  |VARCHAR2 |             |               |          1|              |          1|

-- 转换后GoldenDB-Mysql SQL:
-- unisql.conf中 unisql.char.length.factor = 1(默认值)
select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION,CHAR_LENGTH from unisql.user_tab_columns WHERE TABLE_NAME = upper('test_20251216_2');
TABLE_NAME     |COLUMN_NAME|DATA_TYPE|DATA_TYPE_MOD|DATA_TYPE_OWNER|DATA_LENGTH|DATA_PRECISION|CHAR_LENGTH|
---------------+-----------+---------+-------------+---------------+-----------+--------------+-----------+
TEST_20251216_2|EMP_ID     |DECIMAL  |             |               |          3|             6|          7|
TEST_20251216_2|EMP_NAME   |VARCHAR  |             |               |        400|             0|        400|
TEST_20251216_2|EMAIL      |VARCHAR  |             |               |        400|             0|        400|
TEST_20251216_2|PHONE      |VARCHAR  |             |               |         80|             0|         80|
TEST_20251216_2|DEPT_ID    |DECIMAL  |             |               |          2|             4|          5|
TEST_20251216_2|SALARY     |DECIMAL  |             |               |          4|             8|         10|
TEST_20251216_2|HIRE_DATE  |DATETIME |             |               |          5|             0|         19|
TEST_20251216_2|GENDER     |CHAR     |             |               |          4|             0|          4|
TEST_20251216_2|IS_ACTIVE  |VARCHAR  |             |               |          4|             0|          4|

-- 转换后GoldenDB-Mysql SQL:
-- unisql.conf中 unisql.char.length.factor = 3
select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION,CHAR_LENGTH from unisql.user_tab_columns_utf8 WHERE TABLE_NAME = upper('test_20251216_2');
TABLE_NAME     |COLUMN_NAME|DATA_TYPE|DATA_TYPE_MOD|DATA_TYPE_OWNER|DATA_LENGTH|DATA_PRECISION|CHAR_LENGTH|
---------------+-----------+---------+-------------+---------------+-----------+--------------+-----------+
TEST_20251216_2|EMP_ID     |DECIMAL  |             |               |          3|             6|          2|
TEST_20251216_2|EMP_NAME   |VARCHAR  |             |               |        400|             0|        133|
TEST_20251216_2|EMAIL      |VARCHAR  |             |               |        400|             0|        133|
TEST_20251216_2|PHONE      |VARCHAR  |             |               |         80|             0|         26|
TEST_20251216_2|DEPT_ID    |DECIMAL  |             |               |          2|             4|          1|
TEST_20251216_2|SALARY     |DECIMAL  |             |               |          4|             8|          3|
TEST_20251216_2|HIRE_DATE  |DATETIME |             |               |          5|             0|          6|
TEST_20251216_2|GENDER     |CHAR     |             |               |          4|             0|          1|
TEST_20251216_2|IS_ACTIVE  |VARCHAR  |             |               |          4|             0|          1|

-- 转换后GoldenDB-Mysql SQL:
-- unisql.conf中 unisql.char.length.factor = 4
select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION,CHAR_LENGTH from unisql.user_tab_columns_utf8mb4 WHERE TABLE_NAME = upper('test_20251216_2');
TABLE_NAME     |COLUMN_NAME|DATA_TYPE|DATA_TYPE_MOD|DATA_TYPE_OWNER|DATA_LENGTH|DATA_PRECISION|CHAR_LENGTH|
---------------+-----------+---------+-------------+---------------+-----------+--------------+-----------+
TEST_20251216_2|EMP_ID     |DECIMAL  |             |               |          3|             6|          1|
TEST_20251216_2|EMP_NAME   |VARCHAR  |             |               |        400|             0|        100|
TEST_20251216_2|EMAIL      |VARCHAR  |             |               |        400|             0|        100|
TEST_20251216_2|PHONE      |VARCHAR  |             |               |         80|             0|         20|
TEST_20251216_2|DEPT_ID    |DECIMAL  |             |               |          2|             4|          1|
TEST_20251216_2|SALARY     |DECIMAL  |             |               |          4|             8|          2|
TEST_20251216_2|HIRE_DATE  |DATETIME |             |               |          5|             0|          4|
TEST_20251216_2|GENDER     |CHAR     |             |               |          4|             0|          1|
TEST_20251216_2|IS_ACTIVE  |VARCHAR  |             |               |          4|             0|          1|

1.3.2.12.1.8. all_objects视图

语法

支持
OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS列

警告

  • all_objects 的owner 字段在目标库中仅仅指的是数据库名称,目标库可指用户或模式名称;

  • 源库Oracle的all_objects 用户可查询显示当前用户有权限访问的(包括自己创建的和被授权的)的相关对象,而目标库all_objects可查询整个数据库的相关对象,若仅查询当前用户有权限访问的对象,可在where子句中对owner进行条件限制;

  • all_objects 的object_type 在目标库中包括TABLE、VIEW、INDEX、SEQUENCE;

  • 目标库和源库的对oject_type类型定义不同,例如目标库的TABLE不仅仅指的单纯的表,还包含分区表的分区;

  • 目标库和源库视图中部分列由于数据库的差异,生成内容就有差异,例如DATA_OBJECT_ID、OBJECT_ID等;

  • 目标库视图里面的内容都是大写;

  • 目标库视图字符字段的collation默认设置为utf8_general_ci,如果指定视图字符字段比较时候,要保持比较两端的collation一致,而源库就没有这样的要求;

示例

-- 创建表
CREATE TABLE test_table (
    id INT PRIMARY KEY,
    col INT
);

-- 创建索引
CREATE INDEX idx_test_col ON test_table(col);

-- 创建视图
CREATE OR REPLACE VIEW v_test_table AS
SELECT id, col FROM test_table;

-- 创建序列
CREATE SEQUENCE test_id_seq INCREMENT BY 1;


-- 转换前ORACLE SQL:
select
    OWNER,
    OBJECT_NAME,
    SUBOBJECT_NAME,
    OBJECT_ID,
    DATA_OBJECT_ID,
    OBJECT_TYPE,
    CREATED,
    LAST_DDL_TIME,
    TIMESTAMP,
    STATUS
from
    all_objects
where
    object_name in (UPPER('test_table'), UPPER('test_id_seq'), UPPER('idx_test_col'), UPPER('v_test_table')) ORDER BY object_name
OWNER        |OBJECT_NAME |SUBOBJECT_NAME|OBJECT_ID|DATA_OBJECT_ID|OBJECT_TYPE|CREATED                |LAST_DDL_TIME          |TIMESTAMP          |STATUS|
-------------+------------+--------------+---------+--------------+-----------+-----------------------+-----------------------+-------------------+------+
UNISQL       |IDX_TEST_COL|              |   154375|        154375|INDEX      |2025-12-22 14:55:19.000|2025-12-22 14:55:19.000|2025-12-22:14:55:19|VALID |
UNISQL       |TEST_ID_SEQ |              |   154377|              |SEQUENCE   |2025-12-22 14:55:50.000|2025-12-22 14:55:50.000|2025-12-22:14:55:50|VALID |
UNISQL       |TEST_TABLE  |              |   154372|        154372|TABLE      |2025-12-22 14:55:19.000|2025-12-22 14:55:19.000|2025-12-22:14:55:19|VALID |
UNISQL       |V_TEST_TABLE|              |   154376|              |VIEW       |2025-12-22 14:55:19.000|2025-12-22 14:55:19.000|2025-12-22:14:55:19|VALID |


-- 转换后GoldenDB-Mysql SQL:
SELECT OWNER,OBJECT_NAME,SUBOBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID,OBJECT_TYPE,CREATED,LAST_DDL_TIME,TIMESTAMP,STATUS FROM unisql.all_objects WHERE object_name IN (UPPER('test_table'),UPPER('test_id_seq'),UPPER('idx_test_col'),UPPER('v_test_table')) ORDER BY object_name
OWNER    |OBJECT_NAME |SUBOBJECT_NAME|OBJECT_ID|DATA_OBJECT_ID|OBJECT_TYPE|CREATED                |LAST_DDL_TIME          |TIMESTAMP          |STATUS|
---------+------------+--------------+---------+--------------+-----------+-----------------------+-----------------------+-------------------+------+
UNISQL   |IDX_TEST_COL|              |   673438|        500274|INDEX      |2025-12-22 14:57:47.000|2025-12-22 14:57:47.000|2022-11-24 17:58:23|VALID |
UNISQL   |TEST_ID_SEQ |              |   537226|              |SEQUENCE   |2025-12-22 14:58:07.000|2025-12-22 14:58:07.000|2022-11-24 17:58:23|VALID |
UNISQL   |TEST_TABLE  |              |   537104|              |TABLE      |2025-12-22 14:57:47.000|2025-12-22 14:57:47.000|2022-11-24 17:58:23|VALID |
UNISQL   |V_TEST_TABLE|              |   537105|              |VIEW       |2025-12-22 14:57:47.000|2025-12-22 14:57:47.000|2022-11-24 17:58:23|VALID |

1.3.2.12.1.9. user_objects视图

语法

支持
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS列

警告

  • user_objects 的object_type 在目标库中包括TABLE、VIEW、INDEX、SEQUENCE;

  • 目标库和源库的对oject_type类型定义有差异,例如目标库的TABLE不仅仅指的单纯的表,还包含分区表的分区;

  • 目标库和源库视图中部分列由于数据库的差异,生成内容就有差异,例如DATA_OBJECT_ID、OBJECT_ID等;

  • 目标库视图里面的内容都是大写;

  • 目标库视图字符字段的collation默认设置为utf8_general_ci,如果指定视图字符字段比较时候,要保持比较两端的collation一致,而源库就没有这样的要求;

示例

-- 创建表
CREATE TABLE test_table (
    id INT PRIMARY KEY,
    col INT
);

-- 创建索引
CREATE INDEX idx_test_col ON test_table(col);

-- 创建视图
CREATE OR REPLACE VIEW v_test_table AS
SELECT id, col FROM test_table;

-- 创建序列
CREATE SEQUENCE test_id_seq INCREMENT BY 1;


-- 转换前ORACLE SQL:
select
    OBJECT_NAME,
    SUBOBJECT_NAME,
    OBJECT_ID,
    DATA_OBJECT_ID,
    OBJECT_TYPE,
    CREATED,
    LAST_DDL_TIME,
    TIMESTAMP,
    STATUS
from
    user_objects
where
    object_name in (UPPER('test_table'), UPPER('test_id_seq'), UPPER('idx_test_col'), UPPER('v_test_table')) ORDER BY object_name
OBJECT_NAME |SUBOBJECT_NAME|OBJECT_ID|DATA_OBJECT_ID|OBJECT_TYPE|CREATED                |LAST_DDL_TIME          |TIMESTAMP          |STATUS|
------------+--------------+---------+--------------+-----------+-----------------------+-----------------------+-------------------+------+
IDX_TEST_COL|              |   154375|        154375|INDEX      |2025-12-22 14:55:19.000|2025-12-22 14:55:19.000|2025-12-22:14:55:19|VALID |
TEST_ID_SEQ |              |   154377|              |SEQUENCE   |2025-12-22 14:55:50.000|2025-12-22 14:55:50.000|2025-12-22:14:55:50|VALID |
TEST_TABLE  |              |   154372|        154372|TABLE      |2025-12-22 14:55:19.000|2025-12-22 14:55:19.000|2025-12-22:14:55:19|VALID |
V_TEST_TABLE|              |   154376|              |VIEW       |2025-12-22 14:55:19.000|2025-12-22 14:55:19.000|2025-12-22:14:55:19|VALID |


-- 转换后GoldenDB-Mysql SQL:
SELECT OBJECT_NAME,SUBOBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID,OBJECT_TYPE,CREATED,LAST_DDL_TIME,TIMESTAMP,STATUS FROM unisql.user_objects WHERE object_name IN (UPPER('test_table'),UPPER('test_id_seq'),UPPER('idx_test_col'),UPPER('v_test_table')) ORDER BY object_name
OBJECT_NAME |SUBOBJECT_NAME|OBJECT_ID|DATA_OBJECT_ID|OBJECT_TYPE|CREATED                |LAST_DDL_TIME          |TIMESTAMP          |STATUS|
------------+--------------+---------+--------------+-----------+-----------------------+-----------------------+-------------------+------+
IDX_TEST_COL|              |   673438|        500274|INDEX      |2025-12-22 14:57:47.000|2025-12-22 14:57:47.000|2022-11-24 17:58:23|VALID |
TEST_ID_SEQ |              |   537226|              |SEQUENCE   |2025-12-22 14:58:07.000|2025-12-22 14:58:07.000|2022-11-24 17:58:23|VALID |
TEST_TABLE  |              |   537104|              |TABLE      |2025-12-22 14:57:47.000|2025-12-22 14:57:47.000|2022-11-24 17:58:23|VALID |
V_TEST_TABLE|              |   537105|              |VIEW       |2025-12-22 14:57:47.000|2025-12-22 14:57:47.000|2022-11-24 17:58:23|VALID |

1.3.2.12.1.10. all_users视图

语法

支持
USERNAME,
USER_ID,
CREATED列

警告

  • user_objects 的USERNAME 字段在目标库中仅仅指的是用户,目标库可指用户或模式名称;

  • 目标库中的all_users视图中USER_ID内容为null,没有找到相应的映射字段;

  • 目标库CREATED列不仅仅包含用户创建时间,还要修改用户密码的时间;

  • 目标库视图里面的内容都是大写;

  • 目标库视图字符字段的collation默认设置为utf8_general_ci,如果指定视图字符字段比较时候,要保持比较两端的collation一致,而源库就没有这样的要求;

示例

-- 转换前ORACLE SQL:
CREATE USER test_user1 IDENTIFIED BY password123 ;
SELECT USERNAME,USER_ID,CREATED FROM all_users WHERE USERNAME = UPPER('test_user1');
USERNAME  |USER_ID|CREATED                |
----------+-------+-----------------------+
TEST_USER1|    120|2025-12-22 16:30:36.000|


-- 转换后GoldenDB-Mysql SQL:
CREATE USER IF NOT EXISTS test_user1 IDENTIFIED BY 'password123';
SELECT USERNAME,USER_ID,CREATED FROM unisql.all_users WHERE USERNAME=UPPER('test_user1');
USERNAME  |USER_ID|CREATED                |
----------+-------+-----------------------+
TEST_USER1|       |2025-12-22 16:31:09.000|

1.3.2.12.1.11. user_ind_columns视图

语法

支持
INDEX_NAME,
TABLE_NAME,
COLUMN_NAME,
COLUMN_POSITION,
COLUMN_LENGTH 列

警告

  • 不区分表名、列名、索引名、数据库名的大小写;

  • 需要保证用户名和数据库名相同,会将当前的数据库名当作用户名;

  • 索引必须手动命名,系统自动命名的在两个库中不保证一致;

  • 主键在Golden-Mysql中index_name为primary和oracle不一致;

  • COLUMN_LENGTH列在两个库中不保证一致;

示例

-- 转换前ORACLE SQL:
CREATE TABLE test_ind_columns_view(c1 int, c2 varchar(50), c3 varchar(60), c4 date, CONSTRAINT test_ind_columns_view_pk PRIMARY KEY (c1));
create index test_ind_columns_idx on test_ind_columns_view(c2, c3);
create unique index test_ind_columns_key on test_ind_columns_view(c4);
select INDEX_NAME, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, column_length From user_ind_columns where table_name = upper('test_ind_columns_view');
INDEX_NAME              |TABLE_NAME           |COLUMN_NAME|COLUMN_POSITION|COLUMN_LENGTH|
------------------------+---------------------+-----------+---------------+-------------+
TEST_IND_COLUMNS_IDX    |TEST_IND_COLUMNS_VIEW|C3         |              2|           60|
TEST_IND_COLUMNS_KEY    |TEST_IND_COLUMNS_VIEW|C4         |              1|            7|
TEST_IND_COLUMNS_VIEW_PK|TEST_IND_COLUMNS_VIEW|C1         |              1|           22|
TEST_IND_COLUMNS_IDX    |TEST_IND_COLUMNS_VIEW|C2         |              1|           50|


-- 转换后GoldenDB-Mysql SQL:
CREATE TABLE test_ind_columns_view (c1 bigint,c2 varchar(50),c3 varchar(60),c4 datetime,PRIMARY KEY test_ind_columns_view_pk(c1));
CREATE INDEX test_ind_columns_idx ON test_ind_columns_view (c2, c3);
CREATE UNIQUE INDEX test_ind_columns_key ON test_ind_columns_view (c4);
SELECT INDEX_NAME,TABLE_NAME,COLUMN_NAME,COLUMN_POSITION,column_length FROM unisql.user_ind_columns WHERE table_name=upper('test_ind_columns_view');
+----------------------+-----------------------+-------------+-----------------+---------------+
| INDEX_NAME           | TABLE_NAME            | COLUMN_NAME | COLUMN_POSITION | COLUMN_LENGTH |
+----------------------+-----------------------+-------------+-----------------+---------------+
| PRIMARY              | TEST_IND_COLUMNS_VIEW | C1          |               1 |            19 |
| TEST_IND_COLUMNS_IDX | TEST_IND_COLUMNS_VIEW | C2          |               1 |            50 |
| TEST_IND_COLUMNS_IDX | TEST_IND_COLUMNS_VIEW | C3          |               2 |            60 |
| TEST_IND_COLUMNS_KEY | TEST_IND_COLUMNS_VIEW | C4          |               1 |          NULL |
+----------------------+-----------------------+-------------+-----------------+---------------+

1.3.2.12.1.12. all_ind_columns视图

语法

支持
INDEX_OWNER,
TABLE_OWNER,
INDEX_NAME,
TABLE_NAME,
COLUMN_NAME,
COLUMN_POSITION,
COLUMN_LENGTH 列

警告

  • 不区分表名、列名、索引名、数据库名的大小写;

  • 需要保证用户名和数据库名相同,会将当前的数据库名当作用户名;

  • 索引必须手动命名,系统自动命名的在两个库中不保证一致;

  • 主键在Golden-Mysql中index_name为primary和oracle不一致;

  • COLUMN_LENGTH列在两个库中不保证一致;

  • 需要加上OWNER过滤条件,否则Golden-Mysql查询出来的会多;

示例

-- 转换前ORACLE SQL:
CREATE TABLE test_ind_columns_view(c1 int, c2 varchar(50), c3 varchar(60), c4 date, CONSTRAINT test_ind_columns_view_pk PRIMARY KEY (c1));
create index test_ind_columns_idx on test_ind_columns_view(c2, c3);
create unique index test_ind_columns_key on test_ind_columns_view(c4);
select INDEX_OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, column_length From all_ind_columns where table_name = upper('test_ind_columns_view');
INDEX_OWNER|INDEX_NAME              |TABLE_OWNER|TABLE_NAME           |COLUMN_NAME|COLUMN_POSITION|COLUMN_LENGTH|
-----------+------------------------+-----------+---------------------+-----------+---------------+-------------+
AAA_USER   |TEST_IND_COLUMNS_IDX    |AAA_USER   |TEST_IND_COLUMNS_VIEW|C3         |              2|           60|
AAA_USER   |TEST_IND_COLUMNS_KEY    |AAA_USER   |TEST_IND_COLUMNS_VIEW|C4         |              1|            7|
AAA_USER   |TEST_IND_COLUMNS_VIEW_PK|AAA_USER   |TEST_IND_COLUMNS_VIEW|C1         |              1|           22|
AAA_USER   |TEST_IND_COLUMNS_IDX    |AAA_USER   |TEST_IND_COLUMNS_VIEW|C2         |              1|           50|


-- 转换后GoldenDB-Mysql SQL:
CREATE TABLE test_ind_columns_view (c1 bigint,c2 varchar(50),c3 varchar(60),c4 datetime,PRIMARY KEY test_ind_columns_view_pk(c1));
CREATE INDEX test_ind_columns_idx ON test_ind_columns_view (c2, c3);
CREATE UNIQUE INDEX test_ind_columns_key ON test_ind_columns_view (c4);
SELECT INDEX_OWNER,INDEX_NAME,TABLE_OWNER,TABLE_NAME,COLUMN_NAME,COLUMN_POSITION,column_length FROM unisql.all_ind_columns WHERE table_name=upper('test_ind_columns_view');
+-------------+----------------------+-------------+-----------------------+-------------+-----------------+---------------+
| INDEX_OWNER | INDEX_NAME           | TABLE_OWNER | TABLE_NAME            | COLUMN_NAME | COLUMN_POSITION | COLUMN_LENGTH |
+-------------+----------------------+-------------+-----------------------+-------------+-----------------+---------------+
| AAAAA11111  | PRIMARY              | AAAAA11111  | TEST_IND_COLUMNS_VIEW | C1          |               1 |            19 |
| AAAAA11111  | TEST_IND_COLUMNS_IDX | AAAAA11111  | TEST_IND_COLUMNS_VIEW | C2          |               1 |            50 |
| AAAAA11111  | TEST_IND_COLUMNS_IDX | AAAAA11111  | TEST_IND_COLUMNS_VIEW | C3          |               2 |            60 |
| AAAAA11111  | TEST_IND_COLUMNS_KEY | AAAAA11111  | TEST_IND_COLUMNS_VIEW | C4          |               1 |          NULL |
+-------------+----------------------+-------------+-----------------------+-------------+-----------------+---------------+

1.3.2.12.2. Tdsql_Pg_Oracle

1.3.2.12.2.1. ALL_OBJECTS视图

语法

支持
OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS列

警告

  • all_objects 的owner 字段在oracle中指的是用户(模式名),在目标库tdsql-pg-oracle指模式名称;

  • SUBOBJECT_NAME、CREATED、LAST_DDL_TIME、TIMESTAMP 表示可分区对象子组件名称的字段、系统字典中原生维护对象创建时间、最近一次 DDL 时间及对象定义时间戳,在tdsql-pg-oracle中直接取null,属于语义降级;

  • object_type字段,包含TABLE、VIEW、INDEX、SEQUENCE、FUNCTION、PROCEDURE,没有包含PACKAGE;

  • 目标库和源库视图中部分列由于数据库的差异,生成内容就有差异,例如DATA_OBJECT_ID、OBJECT_ID等;

  • 为了和oracle保持一致使用user_tables视图时,目标库自定义视图后的OWNER , OBJECT_NAME 都转成了大写;

  • all_objects在oracle中可返回是当前用户有权限访问的所有对象,在目标库tdsql-pg-oracle中更接近于“系统可见对象集合”,而非严格意义上的“当前用户可访问对象集合”。

示例

-- 创建表
CREATE TABLE t_simple (
id   NUMBER PRIMARY KEY,
name VARCHAR2(50)
);

-- 创建视图
CREATE OR REPLACE VIEW v_simple AS
SELECT id, name
FROM t_simple;

-- 创建序列
CREATE SEQUENCE seq_simple
START WITH 1;

-- 创建索引
CREATE INDEX idx_t_simple_name
ON t_simple (name);

-- 创建函数
CREATE OR REPLACE FUNCTION f_upper_name (
p_name VARCHAR2
)
RETURN VARCHAR2
AS
BEGIN
RETURN UPPER(p_name);
END;

-- 创建存储过程
CREATE OR REPLACE PROCEDURE p_insert_simple (
p_id   NUMBER,
p_name VARCHAR2
)
AS
BEGIN
INSERT INTO t_simple (id, name)
VALUES (p_id, p_name);
END;


-- 转换前ORACLE SQL:
SELECT
    OWNER,
    OBJECT_NAME,
    SUBOBJECT_NAME,
    OBJECT_ID,
    DATA_OBJECT_ID,
    OBJECT_TYPE,
    CREATED,
    LAST_DDL_TIME,
    TIMESTAMP,
    STATUS
FROM
    ALL_OBJECTS
WHERE OBJECT_NAME IN('T_SIMPLE','IDX_T_SIMPLE_NAME','V_SIMPLE','F_UPPER_NAME','P_INSERT_SIMPLE','SEQ_SIMPLE')
ORDER BY OBJECT_NAME
OWNER        |OBJECT_NAME      |SUBOBJECT_NAME|OBJECT_ID|DATA_OBJECT_ID|OBJECT_TYPE|CREATED                |LAST_DDL_TIME          |TIMESTAMP          |STATUS|
-------------+-----------------+--------------+---------+--------------+-----------+-----------------------+-----------------------+-------------------+------+
UNISQL       |F_UPPER_NAME     |              |   160443|              |FUNCTION   |2026-01-23 11:07:42.000|2026-01-23 11:07:42.000|2026-01-23:11:07:42|VALID |
UNISQL       |IDX_T_SIMPLE_NAME|              |   160444|        160444|INDEX      |2026-01-23 11:11:10.000|2026-01-23 11:11:10.000|2026-01-23:11:11:10|VALID |
UNISQL       |P_INSERT_SIMPLE  |              |   160252|              |PROCEDURE  |2026-01-22 10:18:42.000|2026-01-23 11:07:49.000|2026-01-23:11:07:49|VALID |
UNISQL       |SEQ_SIMPLE       |              |   160442|              |SEQUENCE   |2026-01-23 11:07:42.000|2026-01-23 11:07:42.000|2026-01-23:11:07:42|VALID |
UNISQL       |T_SIMPLE         |              |   160440|        160440|TABLE      |2026-01-23 11:07:42.000|2026-01-23 11:07:42.000|2026-01-23:11:07:42|VALID |
UNISQL       |V_SIMPLE         |              |   160249|              |VIEW       |2026-01-23 11:07:42.000|2026-01-23 11:07:42.000|2026-01-23:11:07:42|VALID |


-- 转换后GoldenDB-Mysql SQL:
SELECT OWNER,OBJECT_NAME,SUBOBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID,OBJECT_TYPE,CREATED,LAST_DDL_TIME,TIMESTAMP,STATUS FROM unisql.ALL_OBJECTS WHERE OBJECT_NAME IN ('T_SIMPLE','IDX_T_SIMPLE_NAME','V_SIMPLE','F_UPPER_NAME','P_INSERT_SIMPLE','SEQ_SIMPLE') ORDER BY OBJECT_NAME
OWNER |OBJECT_NAME      |SUBOBJECT_NAME|OBJECT_ID|DATA_OBJECT_ID|OBJECT_TYPE|CREATED|LAST_DDL_TIME|TIMESTAMP|STATUS|
------+-----------------+--------------+---------+--------------+-----------+-------+-------------+---------+------+
UNISQL|F_UPPER_NAME     |              |  1122799|              |FUNCTION   |       |             |         |VALID |
UNISQL|IDX_T_SIMPLE_NAME|              |  1122798|       1122798|INDEX      |       |             |         |VALID |
UNISQL|P_INSERT_SIMPLE  |              |  1122800|              |PROCEDURE  |       |             |         |VALID |
UNISQL|SEQ_SIMPLE       |              |  1122796|              |SEQUENCE   |       |             |         |VALID |
UNISQL|T_SIMPLE         |              |  1122743|       1122743|TABLE      |       |             |         |VALID |
UNISQL|V_SIMPLE         |              |  1122792|              |VIEW       |       |             |         |VALID |

1.3.2.12.3. PostgreSQL

1.3.2.12.3.1. ALL_OBJECTS视图

语法

支持
OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS列

警告

  • all_objects 的owner 字段在oracle中指的是用户(模式名),在目标库PostgreSQL指模式名称;

  • SUBOBJECT_NAME、CREATED、LAST_DDL_TIME、TIMESTAMP 表示可分区对象子组件名称的字段、系统字典中原生维护对象创建时间、最近一次 DDL 时间及对象定义时间戳,在PostgreSQL中直接取null,属于语义降级;

  • object_type字段,包含TABLE、VIEW、INDEX、SEQUENCE、FUNCTION、PROCEDURE,没有包含PACKAGE;

  • 目标库和源库视图中部分列由于数据库的差异,生成内容就有差异,例如DATA_OBJECT_ID、OBJECT_ID等;

  • 为了和oracle保持一致使用user_tables视图时,目标库自定义视图后的OWNER , OBJECT_NAME 都转成了大写;

  • all_objects在oracle中可返回是当前用户有权限访问的所有对象,在目标库PostgreSQL中更接近于“系统可见对象集合”,而非严格意义上的“当前用户可访问对象集合”。

示例

-- 创建表
CREATE TABLE t_simple (
id   NUMBER PRIMARY KEY,
name VARCHAR2(50)
);

-- 创建视图
CREATE OR REPLACE VIEW v_simple AS
SELECT id, name
FROM t_simple;

-- 创建序列
CREATE SEQUENCE seq_simple
START WITH 1;

-- 创建函数,必须手动转化到pg,统一SQL暂不支持
CREATE OR REPLACE FUNCTION f_upper_name (
p_name VARCHAR2
)
RETURN VARCHAR2
AS
BEGIN
RETURN UPPER(p_name);
END;

-- 创建索引
CREATE INDEX idx_t_simple_name
ON t_simple (name);


-- 创建存储过程,必须手动转化到pg,统一SQL暂不支持
CREATE OR REPLACE PROCEDURE p_insert_simple (
p_id   NUMBER,
p_name VARCHAR2
)
AS
BEGIN
INSERT INTO t_simple (id, name)
VALUES (p_id, p_name);
END;


-- 转换前ORACLE SQL:
SELECT
    OWNER,
    OBJECT_NAME,
    SUBOBJECT_NAME,
    OBJECT_ID,
    DATA_OBJECT_ID,
    OBJECT_TYPE,
    CREATED,
    LAST_DDL_TIME,
    TIMESTAMP,
    STATUS
FROM
    ALL_OBJECTS
WHERE OBJECT_NAME IN('T_SIMPLE','IDX_T_SIMPLE_NAME','V_SIMPLE','F_UPPER_NAME','P_INSERT_SIMPLE','SEQ_SIMPLE')
ORDER BY OBJECT_NAME
OWNER        |OBJECT_NAME      |SUBOBJECT_NAME|OBJECT_ID|DATA_OBJECT_ID|OBJECT_TYPE|CREATED                |LAST_DDL_TIME          |TIMESTAMP          |STATUS|
-------------+-----------------+--------------+---------+--------------+-----------+-----------------------+-----------------------+-------------------+------+
UNISQL       |F_UPPER_NAME     |              |   160443|              |FUNCTION   |2026-01-23 11:07:42.000|2026-01-23 11:07:42.000|2026-01-23:11:07:42|VALID |
UNISQL       |IDX_T_SIMPLE_NAME|              |   160444|        160444|INDEX      |2026-01-23 11:11:10.000|2026-01-23 11:11:10.000|2026-01-23:11:11:10|VALID |
UNISQL       |P_INSERT_SIMPLE  |              |   160252|              |PROCEDURE  |2026-01-22 10:18:42.000|2026-01-23 11:07:49.000|2026-01-23:11:07:49|VALID |
UNISQL       |SEQ_SIMPLE       |              |   160442|              |SEQUENCE   |2026-01-23 11:07:42.000|2026-01-23 11:07:42.000|2026-01-23:11:07:42|VALID |
UNISQL       |T_SIMPLE         |              |   160440|        160440|TABLE      |2026-01-23 11:07:42.000|2026-01-23 11:07:42.000|2026-01-23:11:07:42|VALID |
UNISQL       |V_SIMPLE         |              |   160249|              |VIEW       |2026-01-23 11:07:42.000|2026-01-23 11:07:42.000|2026-01-23:11:07:42|VALID |


-- 转换后PostgreSQL SQL:
SELECT OWNER,OBJECT_NAME,SUBOBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID,OBJECT_TYPE,CREATED,LAST_DDL_TIME,TIMESTAMP,STATUS FROM unisql.ALL_OBJECTS WHERE OBJECT_NAME IN ('T_SIMPLE','IDX_T_SIMPLE_NAME','V_SIMPLE','F_UPPER_NAME','P_INSERT_SIMPLE','SEQ_SIMPLE') ORDER BY OBJECT_NAME
owner |object_name      |subobject_name|object_id|data_object_id|object_type|created|last_ddl_time|timestamp|status|
------+-----------------+--------------+---------+--------------+-----------+-------+-------------+---------+------+
UNISQL|F_UPPER_NAME     |              |   228067|              |FUNCTION   |       |             |         |VALID |
UNISQL|IDX_T_SIMPLE_NAME|              |   228069|        228069|INDEX      |       |             |         |VALID |
UNISQL|P_INSERT_SIMPLE  |              |   228070|              |PROCEDURE  |       |             |         |VALID |
UNISQL|SEQ_SIMPLE       |              |   227788|              |SEQUENCE   |       |             |         |VALID |
UNISQL|T_SIMPLE         |              |   227776|        227776|TABLE      |       |             |         |VALID |
UNISQL|V_SIMPLE         |              |   227784|              |VIEW       |       |             |         |VALID |

1.3.2.12.3.2. ALL_TAB_COLUMNS视图

语法

支持
OWNER,
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE,
DATA_TYPE_MOD,
DATA_TYPE_OWNER,
DATA_LENGTH,
DATA_PRECISION

警告

  • OWNER 字段在oracle中指的是用户(模式名),在目标库pg指模式名称;

  • TABLE_NAME、COLUMN_NAME 都转成了大写;

  • DATA_TYPE通过统一sql转换后类型不一致,使用时需要注意,如下:

    Oracle DATA_TYPE

    统一SQL转换后DATA_TYPE

    自定义all_tab_columns视图中DATA_TYPE

    BINARY_FLOAT

    real

    FLOAT4

    BINARY_DOUBLE

    double precision

    FLOAT8

    BLOB

    bytea

    BYTEA

    CLOB

    text

    TEXT

    NCLOB

    text

    TEXT

    CHAR

    char

    BPCHAR

    CHARACTER

    char

    BPCHAR

    DATE

    datetime

    TIMESTAMP

    TIMESTAMP

    timestamp(0)

    TIMESTAMP

    DECIMAL

    decimal

    NUMERIC

    DEC

    decimal

    NUMERIC

    NUMBER

    NUMBER

    NUMERIC

    NUMERIC

    NUMBER

    NUMERIC

    DOUBLE PRECISION

    double precision

    FLOAT8

    FLOAT

    double precision

    FLOAT8

    REAL

    real

    FLOAT8

    INTEGER

    bigint

    INT8

    INT

    bigint

    INT8

    SMALLINT

    bigint

    INT8

    LONG

    text

    TEXT

    LONG RAW

    bytea

    BYTEA

    NCHAR

    char

    BPCHAR

    NCHAR VARYING

    varchar

    VARCHAR

    NVARCHAR2

    varchar

    VARCHAR

    RAW

    bytea

    BYTEA

    VARCHAR

    varchar

    VARCHAR

    VARCHAR2

    varchar

    VARCHAR

    TIMESTAMP(n) WITH TIME ZONE

    timestamp(p) with time zone

    TIMESTAMPTZ

    INTERVAL YEAR(n) TO MONTH

    interval year to month

    INTERVAL

    INTERVAL DAY(p) TO SECOND(s)

    interval day to second(s)

    INTERVAL

    ROWID

    char

    BPCHAR

    UROWID(n)

    varchar

    VARCHAR

    XMLTYPE

    xml

    XML

    BFILE

    不支持

    TIMESTAMP(n) WITH LOCAL TIME ZONE

    不支持

  • DATA_TYPE_MOD , DATA_TYPE_OWNER 字段语义降级,转化后视图中上述字段统一返回 NULL,属于语义降级处理;

  • DATA_LENGTH列的「物理存储最大字节数」不一致,oracle中VARCHAR2(100) 的DATA_LENGTH为100(字节),pg中VARCHAR(100)的DATA_LENGTH也为100,pg中CHAR(100)的DATA_LENGTH也为100,其他的数据类型不一样;

  • DATA_PRECISION列的「精度」,针对于oracle中NUMBER(s,p)定义了s精度,转化到pg也是NUMBER(s,p)decimal(s,p),则相等。没有定义精度直接是NUMBER的和其他类型则不相等;

  • 权限可见性差异,Oracle 的 ALL_TAB_COLUMNS 返回当前用户有权限访问的表列集合,pg 视图返回结果更接近于系统目录中可见的对象列集合(过滤pg_totast相关),而非严格意义上的“当前用户可访问列集合”。

示例

-- 创建表
CREATE TABLE t_oracle_datatype_doc (
    col_01_binary_float              BINARY_FLOAT,
    col_02_binary_double             BINARY_DOUBLE,
    col_04_blob                      BLOB,
    col_05_char                      CHAR(10),
    col_06_clob                      CLOB,
    col_07_date                      DATE,
    col_08_decimal                   DECIMAL(10,2),
    col_09_double_precision          DOUBLE PRECISION,
    col_10_float_p                   FLOAT(126),
    col_11_integer                   INTEGER,
    col_12_interval_ym               INTERVAL YEAR(4) TO MONTH,
    col_13_interval_ds               INTERVAL DAY(3) TO SECOND(6),
    col_15_long_raw                  LONG RAW,
    col_16_nchar                     NCHAR(10),
    col_17_nchar_varying             NCHAR VARYING(30),
    col_18_nclob                     NCLOB,
    col_19_number                    NUMBER(15,6),
    col_20_nvarchar2                 NVARCHAR2(50),
    col_21_raw                       RAW(32),
    col_22_real                      REAL,
    col_23_rowid                     ROWID,
    col_24_smallint                  SMALLINT,
    col_25_timestamp                 TIMESTAMP(6),
    col_26_timestamp_tz              TIMESTAMP(6) WITH TIME ZONE,
    col_29_urowid                    UROWID(4000),
    col_30_varchar                   VARCHAR(50),
    col_31_varchar2                  VARCHAR2(100),
    col_32_xmltype                   XMLTYPE
);

-- 转换前Oracle SQL:
select
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE,
    DATA_TYPE_MOD,
    DATA_TYPE_OWNER,
    DATA_LENGTH,
    DATA_PRECISION
from
    all_tab_columns
where
    TABLE_NAME = upper('t_oracle_datatype_doc')
order by
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE,
    DATA_TYPE_MOD,
    DATA_TYPE_OWNER,
    DATA_LENGTH,
    DATA_PRECISION;
TABLE_NAME           |COLUMN_NAME            |DATA_TYPE                   |DATA_TYPE_MOD|DATA_TYPE_OWNER|DATA_LENGTH|DATA_PRECISION|
---------------------+-----------------------+----------------------------+-------------+---------------+-----------+--------------+
T_ORACLE_DATATYPE_DOC|COL_01_BINARY_FLOAT    |BINARY_FLOAT                |             |               |          4|              |
T_ORACLE_DATATYPE_DOC|COL_02_BINARY_DOUBLE   |BINARY_DOUBLE               |             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_04_BLOB            |BLOB                        |             |               |       4000|              |
T_ORACLE_DATATYPE_DOC|COL_05_CHAR            |CHAR                        |             |               |         10|              |
T_ORACLE_DATATYPE_DOC|COL_06_CLOB            |CLOB                        |             |               |       4000|              |
T_ORACLE_DATATYPE_DOC|COL_07_DATE            |DATE                        |             |               |          7|              |
T_ORACLE_DATATYPE_DOC|COL_08_DECIMAL         |NUMBER                      |             |               |         22|            10|
T_ORACLE_DATATYPE_DOC|COL_09_DOUBLE_PRECISION|FLOAT                       |             |               |         22|           126|
T_ORACLE_DATATYPE_DOC|COL_10_FLOAT_P         |FLOAT                       |             |               |         22|           126|
T_ORACLE_DATATYPE_DOC|COL_11_INTEGER         |NUMBER                      |             |               |         22|              |
T_ORACLE_DATATYPE_DOC|COL_12_INTERVAL_YM     |INTERVAL YEAR(4) TO MONTH   |             |               |          5|             4|
T_ORACLE_DATATYPE_DOC|COL_13_INTERVAL_DS     |INTERVAL DAY(3) TO SECOND(6)|             |               |         11|             3|
T_ORACLE_DATATYPE_DOC|COL_15_LONG_RAW        |LONG RAW                    |             |               |          0|              |
T_ORACLE_DATATYPE_DOC|COL_16_NCHAR           |NCHAR                       |             |               |         20|              |
T_ORACLE_DATATYPE_DOC|COL_17_NCHAR_VARYING   |NVARCHAR2                   |             |               |         60|              |
T_ORACLE_DATATYPE_DOC|COL_18_NCLOB           |NCLOB                       |             |               |       4000|              |
T_ORACLE_DATATYPE_DOC|COL_19_NUMBER          |NUMBER                      |             |               |         22|            15|
T_ORACLE_DATATYPE_DOC|COL_20_NVARCHAR2       |NVARCHAR2                   |             |               |        100|              |
T_ORACLE_DATATYPE_DOC|COL_21_RAW             |RAW                         |             |               |         32|              |
T_ORACLE_DATATYPE_DOC|COL_22_REAL            |FLOAT                       |             |               |         22|            63|
T_ORACLE_DATATYPE_DOC|COL_23_ROWID           |ROWID                       |             |               |         10|              |
T_ORACLE_DATATYPE_DOC|COL_24_SMALLINT        |NUMBER                      |             |               |         22|              |
T_ORACLE_DATATYPE_DOC|COL_25_TIMESTAMP       |TIMESTAMP(6)                |             |               |         11|              |
T_ORACLE_DATATYPE_DOC|COL_26_TIMESTAMP_TZ    |TIMESTAMP(6) WITH TIME ZONE |             |               |         13|              |
T_ORACLE_DATATYPE_DOC|COL_29_UROWID          |UROWID                      |             |               |       4000|              |
T_ORACLE_DATATYPE_DOC|COL_30_VARCHAR         |VARCHAR2                    |             |               |         50|              |
T_ORACLE_DATATYPE_DOC|COL_31_VARCHAR2        |VARCHAR2                    |             |               |        100|              |
T_ORACLE_DATATYPE_DOC|COL_32_XMLTYPE         |XMLTYPE                     |             |PUBLIC         |       2000|              |

-- 转化后PostgreSQL SQL:
SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION FROM unisql.all_tab_columns WHERE TABLE_NAME=upper('t_oracle_datatype_doc') ORDER BY TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_TYPE_MOD,DATA_TYPE_OWNER,DATA_LENGTH,DATA_PRECISION;
table_name           |column_name            |data_type  |data_type_mod|data_type_owner|data_length|data_precision|
---------------------+-----------------------+-----------+-------------+---------------+-----------+--------------+
T_ORACLE_DATATYPE_DOC|COL_01_BINARY_FLOAT    |FLOAT4     |             |               |          4|              |
T_ORACLE_DATATYPE_DOC|COL_02_BINARY_DOUBLE   |FLOAT8     |             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_04_BLOB            |BYTEA      |             |               |           |              |
T_ORACLE_DATATYPE_DOC|COL_05_CHAR            |BPCHAR     |             |               |         10|              |
T_ORACLE_DATATYPE_DOC|COL_06_CLOB            |TEXT       |             |               |           |              |
T_ORACLE_DATATYPE_DOC|COL_07_DATE            |TIMESTAMP  |             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_08_DECIMAL         |NUMERIC    |             |               |     655362|            10|
T_ORACLE_DATATYPE_DOC|COL_09_DOUBLE_PRECISION|FLOAT8     |             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_10_FLOAT_P         |FLOAT8     |             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_11_INTEGER         |INT8       |             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_12_INTERVAL_YM     |INTERVAL   |             |               |         16|              |
T_ORACLE_DATATYPE_DOC|COL_13_INTERVAL_DS     |INTERVAL   |             |               |         16|              |
T_ORACLE_DATATYPE_DOC|COL_15_LONG_RAW        |BYTEA      |             |               |           |              |
T_ORACLE_DATATYPE_DOC|COL_16_NCHAR           |BPCHAR     |             |               |         10|              |
T_ORACLE_DATATYPE_DOC|COL_17_NCHAR_VARYING   |VARCHAR    |             |               |         30|              |
T_ORACLE_DATATYPE_DOC|COL_18_NCLOB           |TEXT       |             |               |           |              |
T_ORACLE_DATATYPE_DOC|COL_19_NUMBER          |NUMERIC    |             |               |     983046|            15|
T_ORACLE_DATATYPE_DOC|COL_20_NVARCHAR2       |VARCHAR    |             |               |         50|              |
T_ORACLE_DATATYPE_DOC|COL_21_RAW             |BYTEA      |             |               |           |              |
T_ORACLE_DATATYPE_DOC|COL_22_REAL            |FLOAT8     |             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_23_ROWID           |BPCHAR     |             |               |         10|              |
T_ORACLE_DATATYPE_DOC|COL_24_SMALLINT        |INT8       |             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_25_TIMESTAMP       |TIMESTAMP  |             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_26_TIMESTAMP_TZ    |TIMESTAMPTZ|             |               |          8|              |
T_ORACLE_DATATYPE_DOC|COL_29_UROWID          |VARCHAR    |             |               |       4000|              |
T_ORACLE_DATATYPE_DOC|COL_30_VARCHAR         |VARCHAR    |             |               |         50|              |
T_ORACLE_DATATYPE_DOC|COL_31_VARCHAR2        |VARCHAR    |             |               |        100|              |
T_ORACLE_DATATYPE_DOC|COL_32_XMLTYPE         |XML        |             |               |           |              |

1.3.2.12.3.3. DBA_INDEXES视图

语法

支持
OWNER,
INDEX_NAME,
INDEX_TYPE,
TABLE_OWNER,
TABLE_NAME,
TABLE_TYPE,
UNIQUENESS列

警告

  • OWNER 字段在oracle中指的是用户(模式名),在目标库pg指模式名称;

  • 目标库创建后的OWNER, INDEX_NAME, INDEX_TYPE, TABLE_OWNER, TABLE_NAME默认为小写,为了和oracle保持一致使用dba_indexes视图时,都转成了大写;

  • 索引名称未指定时,两边库自动生成的索引名称不一致;

  • INDEX_TYPE,统一sql的转化不同,目标库的视图除了函数索引(FUNCTION-BASED NORMAL),其他均是普通索引(NORMAL);

  • TABLE_TYPE在目标库的视图中,只有TABLE(对应表),VIEW(对应视图)、INDEX(其他);

  • Oracle 的 dba_indexes 返回当前用户有权限访问的索引集合;PostgreSQL 系统目录不提供完全等价的权限过滤机制,本视图结果更接近于系统可见索引集合。

示例

CREATE TABLE test_20251216_1 (
    dept_id    NUMBER(4)       NOT NULL,  -- 部门ID(非空)
    dept_name  VARCHAR2(50)    NOT NULL,  -- 部门名称(非空)
    create_time DATE DEFAULT SYSDATE,     -- 创建时间(默认当前时间)
    -- 主键约束(命名约束,推荐显式命名便于维护)
    CONSTRAINT pk_dept PRIMARY KEY (dept_id),
    -- 唯一约束(部门名称不能重复)
    CONSTRAINT uk_dept_name UNIQUE (dept_name),
    -- 检查约束(部门ID必须大于0)
    CONSTRAINT ck_dept_id CHECK (dept_id > 0)
);

CREATE TABLE test_20251216_2 (
    -- 基础字段定义
    emp_id     NUMBER(6)       NOT NULL,  -- 员工ID(非空约束,列级)
    emp_name   VARCHAR2(100)   NOT NULL,  -- 员工姓名(非空)
    email      VARCHAR2(100),             -- 邮箱
    phone      VARCHAR2(20),              -- 手机号
    dept_id    NUMBER(4),                 -- 所属部门(关联dept表)
    salary     NUMBER(8,2),               -- 薪资
    hire_date  DATE,                      -- 入职日期
    gender     CHAR(1),                   -- 性别(男/女)
    is_active  VARCHAR2(1) DEFAULT 'Y',   -- 是否在职(默认Y)

    -- 主键约束
    CONSTRAINT pk_emp PRIMARY KEY (emp_id),
    -- 唯一约束
    CONSTRAINT uk_emp_email UNIQUE (email),
    CONSTRAINT uk_emp_phone UNIQUE (phone),
    -- 外键约束(Oracle仅支持ON DELETE,不支持ON UPDATE)
    CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id)
        REFERENCES test_20251216_1 (dept_id)
        ON DELETE SET NULL,  -- 仅保留ON DELETE SET NULL(Oracle支持)
    -- 检查约束(薪资必须大于0)
    CONSTRAINT ck_emp_salary CHECK (salary > 0)
);


CREATE INDEX idx_emp_name ON test_20251216_2 (emp_name);
CREATE INDEX idx_emp_dept_hire ON test_20251216_2 (dept_id, hire_date);
CREATE BITMAP INDEX idx_emp_gender ON test_20251216_2 (gender);
CREATE BITMAP INDEX idx_emp_is_active ON test_20251216_2 (is_active);
CREATE INDEX idx_emp_name_upper ON test_20251216_2 (upper(emp_name));

-- 转换前ORACLE SQL:
select
    INDEX_NAME,
    INDEX_TYPE,
    TABLE_OWNER,
    TABLE_NAME,
    TABLE_TYPE,
    UNIQUENESS
from
    dba_indexes
where
    TABLE_NAME = upper('test_20251216_2')
order by
    owner,
    INDEX_NAME,
    INDEX_TYPE,
    TABLE_OWNER,
    TABLE_NAME,
    TABLE_TYPE,
    UNIQUENESS;
INDEX_NAME        |INDEX_TYPE           |TABLE_OWNER  |TABLE_NAME     |TABLE_TYPE|UNIQUENESS|
------------------+---------------------+-------------+---------------+----------+----------+
IDX_EMP_DEPT_HIRE |NORMAL               |UNXSQL_TEST  |TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_GENDER    |BITMAP               |UNXSQL_TEST  |TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_IS_ACTIVE |BITMAP               |UNXSQL_TEST  |TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_NAME      |NORMAL               |UNXSQL_TEST  |TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_NAME_UPPER|FUNCTION-BASED NORMAL|UNXSQL_TEST  |TEST_20251216_2|TABLE     |NONUNIQUE |
PK_EMP            |NORMAL               |UNXSQL_TEST  |TEST_20251216_2|TABLE     |UNIQUE    |
UK_EMP_EMAIL      |NORMAL               |UNXSQL_TEST  |TEST_20251216_2|TABLE     |UNIQUE    |
UK_EMP_PHONE      |NORMAL               |UNXSQL_TEST  |TEST_20251216_2|TABLE     |UNIQUE    |

-- 转换后PostgreSQL SQL:
SELECT INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,UNIQUENESS FROM unisql.dba_indexes WHERE TABLE_NAME=upper('test_20251216_2') ORDER BY owner,INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,UNIQUENESS;
index_name        |index_type           |table_owner|table_name     |table_type|uniqueness|
------------------+---------------------+-----------+---------------+----------+----------+
IDX_EMP_DEPT_HIRE |NORMAL               |UNXSQL_TEST |TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_GENDER    |NORMAL               |UNXSQL_TEST |TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_IS_ACTIVE |NORMAL               |UNXSQL_TEST |TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_NAME      |NORMAL               |UNXSQL_TEST |TEST_20251216_2|TABLE     |NONUNIQUE |
IDX_EMP_NAME_UPPER|FUNCTION-BASED NORMAL|UNXSQL_TEST |TEST_20251216_2|TABLE     |NONUNIQUE |
PK_EMP            |NORMAL               |UNXSQL_TEST |TEST_20251216_2|TABLE     |UNIQUE    |
UK_EMP_EMAIL      |NORMAL               |UNXSQL_TEST |TEST_20251216_2|TABLE     |UNIQUE    |
UK_EMP_PHONE      |NORMAL               |UNXSQL_TEST |TEST_20251216_2|TABLE     |UNIQUE    |

1.3.2.12.3.4. ALL_INDEXES视图

参照 DBA_INDEXES视图

1.3.2.12.3.5. DBA_TABLES视图

语法

支持
OWNER,
TABLE_OWNER,
TEMPORARY列

警告

  • OWNER 字段在oracle中指的是用户(模式名),在目标库pg指模式名称,如果创建的是临时表,指的是会话私有的临时模式;

  • 目标库创建后的OWNER, TABLE_OWNER默认为小写,为了和oracle保持一致使用dba_tables视图时,都默认为大写;

示例

-- 创建表
 CREATE TABLE t_simple (
    id   NUMBER PRIMARY KEY,
    name VARCHAR2(50)
);

-- 创建临时表
CREATE GLOBAL  TEMPORARY TABLE t_simple_temp (
    id   NUMBER PRIMARY KEY,
    name VARCHAR2(50)
);

-- 转换前ORACLE SQL:
SELECT
    owner,
    table_name ,
    TEMPORARY
FROM
    dba_tables
WHERE
    table_name = upper('t_simple')
    OR table_name = upper('t_simple_temp') ORDER BY table_name
OWNER        |TABLE_NAME   |TEMPORARY|
-------------+-------------+---------+
UNISQL       |T_SIMPLE     |N        |
UNISQL       |T_SIMPLE_TEMP|Y        |

-- 转换后PostgreSQL SQL:
SELECT owner,table_name,TEMPORARY FROM unisql.dba_tables WHERE table_name=upper('t_simple') OR table_name=upper('t_simple_temp') ORDER BY table_name
owner    |table_name   |temporary|
---------+-------------+---------+
UNISQL   |T_SIMPLE     |N        |
PG_TEMP_8|T_SIMPLE_TEMP|Y        |

1.3.2.12.3.6. ALL_TABLES视图

参照 DBA_TABLES视图