10.4. 系统视图

本节主要介绍统一SQL支持原生Oracle数据库中的系统视图。

警告

由于Gaussdb-Oracle不存在user_tables,tabs,user_table_columns,cols,user_users所以在使用统一SQL转换查询系统视图时,需要先导入创建视图的脚本(参考快速开始-》导入目标库脚本一节)

对于user_tables,tabs,user_table_columns,cols的转换说明:

  1. 在Gaussdb-Oracle中不能存在user_tables,tabs,user_table_columns,cols同名的表和视图;

  2. 用户自定义表名和系统视图同名时,统一SQL会进行转换,在目标库执行时结果不正确。

    先创建表: create table tabs(id int,name varchar2(10));
    查询语句: select * from tabs;
    统一SQL转换后: select * from unisql.tabs; //结果不正确;
    更新语句: update tabs set id = 1 where id = 1;
    统一SQL转换后: update unisql.tabs set id = 1 where id = 1;//结果不正确;
  3. 对于查询【支持字段】之外的字段,统一SQL会进行转换,在目标库执行时才会报错;

  4. 使用””查询时字段名必须全部小写,以下SQL转换后在Gauss-Oracle中执行时会报错;

    例如:select “TABLE_NAME”,”TABLESPACE_NAME” from user_tables;
  5. 不要使用user_tables,tabs,user_table_columns,cols作为with语句的别名

    Oracle SQL: with tabs AS (select * FROM cols_t) SELECT * FROM tabs;
    转换后SQL: with tabs AS (select * FROM cols_t) SELECT * FROM unisql.tabs // 导致语义不一致;
  6. 因为COLLATION在Gaussdb-Oracle中是一个关键字,对于user_tab_columns和cols中的”COLLATION”字段,在使用时要使用以下方式:

    Oracle SQL:select “COLLATION” from user_tab_columns;
    转换后SQL:SELECT “COLLATION” FROM unisql.user_tab_columns

10.4.1. user_tables

描述
该视图描述当前用户可访问的关系表

支持字段

字段

Oracle字段类型

unisql.user_tables字段类型

字段说明

OWNER

character varying(64)

表所属用户

TABLE_NAME

VARCHAR2(128)

character varying(64)

表名

TABLESPACE_NAME

VARCHAR2(30)

character varying(64)

存储表的表空间名称

STATUS

VARCHAR2(8)

character varying(8)

当前记录是否有效

LOGGING

VARCHAR2(3)

character varying(3)

表的更改是否记入日志

PARTITIONED

VARCHAR2(3)

character varying(3)

表是否为分区表

TEMPORARY

VARCHAR2(1)

character(1)

是否为临时表

DROPPED

VARCHAR2(3)

character varying

当前记录是否已删除

READ_ONLY

VARCHAR2(3)

character varying(3)

暂不支持,置NULL

SEGMENT_CREATED

VARCHAR2(3)

character varying(3)

表段是否已被创建

HAS_IDENTITY

VARCHAR2(3)

character varying(3)

表是否具有标识列

EXTERNAL

VARCHAR2(3)

character varying(3)

表是否为外表

示例

-- 转换前Oracle SQL:
SELECT * FROM user_tables;
-- 转换后Gaussdb-Oracle SQL:
SELECT * FROM unisql.user_tables;

-- 转换前Oracle SQL:
SELECT table_name,tablespace_name,status,logging FROM user_tables
-- 转换后Gaussdb-Oracle SQL:
SELECT table_name,tablespace_name,status,logging FROM unisql.user_tables

-- 转换前Oracle SQL:
SELECT table_name,tablespace_name FROM user_tables WHERE upper(table_name) = 'A';
-- 转换后Gaussdb-Oracle SQL:
SELECT table_name,tablespace_name FROM unisql.user_tables WHERE upper(table_name)='A'

10.4.2. tabs

描述
tabs是user_tables的同义词,描述当前用户可访问的关系表

支持字段

参考user_tables的支持字段

示例

-- 转换前Oracle SQL:
SELECT * FROM tabs;
-- 转换后Gaussdb-Oracle SQL:
SELECT * FROM unisql.tabs;

-- 转换前Oracle SQL:
SELECT table_name,tablespace_name,status,logging FROM tabs
-- 转换后Gaussdb-Oracle SQL:
SELECT table_name,tablespace_name,status,logging FROM unisql.tabs

10.4.3. user_tab_columns

描述
该视图描述当前用户拥有的表,视图和cluster的列

支持字段

字段

Oracle字段类型

unisql.user_table_columns字段类型

字段说明

OWNER

character varying(64)

表所属用户

TABLE_NAME

VARCHAR2(128)

character varying(64)

表名

COLUMN_NAME

VARCHAR2(128)

character varying(64)

列名

DATA_TYPE

VARCHAR2(128)

character varying(128)

列的数据类型

DATA_TYPE_MOD

VARCHAR2(3)

character varying(3)

暂不支持,置NULL

DATA_TYPE_OWNER

VARCHAR2(128)

character varying(128)

列的数据类型的所有者

DATA_LENGTH

NUMBER

integer

列的字节长度

DATA_PRECISION

NUMBER

integer

数据类型的精度

DATA_SCALE

NUMBER

integer

小数点右边的位数

NULLABLE

VARCHAR2(1)

bpchar

该列是否允许为空

COLUMN_ID

NUMBER

integer

创建表时列的序号

DEFAULT_LENGTH

NUMBER

numeric

列的默认值字节长度

DATA_DEFAULT

LONG

text

列的默认值

NUM_DISTINCT

NUMBER

numeric

列中不同值的数量

LOW_VALUE

RAW(1000)

raw

列中的最小值

HIGH_VALUE

RAW(1000)

raw

列中的最大值

DENSITY

NUMBER

numeric

列密度

NUM_NULLS

NUMBER

numeric

列中空值数

NUM_BUCKETS

NUMBER

numeric

列的直方图的桶数

LAST_ANALYZED

DATE

date

上次分析的日期

SAMPLE_SIZE

NUMBER

numeric

用于分析此列的样本量

CHARACTER_SET_NAME

VARCHAR2(44)

character varying(44)

暂不支持,置NULL

CHAR_COL_DECL_LENGTH

NUMBER

numeric

字符类型列的声明长度

GLOBAL_STATS

VARCHAR2(3)

character varying(3)

暂不支持,置NO

USER_STATS

VARCHAR2(3)

character varying(3)

暂不支持,置NO

AVG_COL_LEN

NUMBER

numeric

列的平均长度 (单位字节)

CHAR_LENGTH

NUMBER

numeric

列的长度(单位字符)

CHAR_USED

VARCHAR2(1)

character varying(1)

暂不支持,varchar,nvarchar2,bpchar,char类型置B,其余置NULL

DEFAULT_ON_NULL

VARCHAR2(3)

character varying(3)

暂不支持,置NULL

IDENTITY_COLUMN

VARCHAR2(3)

character varying(3)

暂不支持,置NULL

COLLATION

VARCHAR2(100)

character varying(100)

列的排序规则

示例

-- 转换前Oracle SQL:
SELECT * FROM user_tab_columns;
-- 转换后Gaussdb-Oracle SQL:
SELECT * FROM unisql.user_tab_columns

-- 转换前Oracle SQL:
SELECT table_name,column_name,data_type,data_type_mod FROM user_tab_columns;
-- 转换后Gaussdb-Oracle SQL:
SELECT table_name,column_name,data_type,data_type_mod FROM unisql.user_tab_columns

10.4.4. cols

描述
cols是user_tab_columns的同义词,描述当前用户拥有的表,视图和cluster的列

支持字段

参考user_tab_columns的支持字段

示例

-- 转换前Oracle SQL:
SELECT * FROM cols;
-- 转换后Gaussdb-Oracle SQL:
SELECT * FROM unisql.cols

-- 转换前Oracle SQL:
SELECT table_name,column_name,data_type,data_type_mod FROM cols;
-- 转换后Gaussdb-Oracle SQL:
SELECT table_name,column_name,data_type,data_type_mod FROM unisql.cols

10.4.5. user_users

描述
该视图描述当前用户信息

支持字段

字段

Oracle字段类型

unisql.user_users字段类型

字段说明

备注(字段默认值)

USERNAME

VARCHAR2(128)

text

用户名

USER_ID

NUMBER

oid

用户ID

ACCOUNT_STATUS

VARCHAR2(32)

text

账户状态

NORMAL

LOCK_DATE

DATE

timestamp

锁定帐户的日期

NULL

EXPIRY_DATE

DATE

timestamptz

帐户到期日期

DEFAULT_TABLESPACE

VARCHAR2(30)

text

数据默认表空间

NULL

TEMPORARY_TABLESPACE

VARCHAR2(30)

text

数据临时表空间

NULL

CREATED

DATE

timestamp

用户创建日期

NULL

INITIAL_RSRC_CONSUMER_GROUP

VARCHAR2(128)

text

用户的初始资源消费者组

NULL

EXTERNAL_NAME

VARCHAR2(4000)

text

用户外部名称

NULL

示例

-- 转换前Oracle SQL:
SELECT username,user_id,account_status,lock_date,expiry_date,default_tablespace,temporary_tablespace,created,initial_rsrc_consumer_group,external_name FROM user_users;
-- 转换后Gaussdb-Oracle SQL:
SELECT username,user_id,account_status,lock_date,expiry_date,default_tablespace,temporary_tablespace,created,initial_rsrc_consumer_group,external_name FROM unisql.user_users;

-- 转换前Oracle SQL:
SELECT username,user_id,account_status FROM user_users WHERE username='TEST';
-- 转换后Gaussdb-Oracle SQL:
SELECT username,user_id,account_status FROM unisql.user_users WHERE username=upper('TEST')