ITPub博客

首页 > 数据库 > > Gauss 100 数据库函数介绍之其他函数Part2

Gauss 100 数据库函数介绍之其他函数Part2

作者:GaussDB_数据库 时间:2020-03-02 10:17:54 0 删除 编辑

DBA_SEGSIZE

语法:

DBA_SEGSIZE(size_type,table_entry)

功能:属于DBA诊断函数,用于返回普通表的大小。

说明:

  • 该函数为诊断函数,非DBA角色的用户不能直接调用该函数。

  • size_type:大小类型。

    • 0:字节数。

    • 1:页面数。

    • 2:EXTENTS数。

  • table_entry:普通表的入口entry,需要查询系统表TABLE$才能获取。

示例:

返回普通表的大小。

--预置创建普通表。
CREATE TABLE TEST(A INT, B INT);
--加入数据。
INSERT INTO TEST VALUES(1);
--查询表大小。
SELECT DBA_SEGSIZE(0, T.ENTRY) FROM GAUSSDBA.TABLE$ T WHERE T.NAME = 'TEST';

DBA_SEGSIZE(0, T.ENTRY)
-----------------------
65536

1 rows fetched.

DBA_SPACE_NAME

语法:

DBA_SPACE_NAME(space_id)

功能:属于DBA诊断函数,用于返回表空间ID所在的表名。

说明:

  • 该函数为诊断函数,用于返回表空间ID所在的表名,表空间ID不存在的时候会报错。

  • space_id:表空间ID。

示例:

用于返回表空间ID所在的表名。

SELECT DBA_SPACE_NAME(0);

DBA_SPACE_NAME(0)
----------------------------------------------------------------
SYSTEM

1 rows fetched.

DBA_SPCSIZE

语法:

DBA_SPCSIZE(space_id,size_type_name)

功能:属于DBA诊断函数,用于返回表空间大小。

说明:

  • 该函数为诊断函数,非DBA角色的用户不能直接调用该函数。

  • space_id:表空间ID。

  • size_type_name:大小类型。

    • 'PAGE':每一个页面的大小,单位是字节,一般默认是8K。

    • 'TOTAL':总字节大小。

    • 'USED':已使用的大小。

示例:

返回表空间大小。

SELECT DBA_SPCSIZE(0,'TOTAL');

DBA_SPCSIZE(0,'TOTAL')
----------------------
134217728

1 rows fetched.

DBA_TABTYPE

语法:

DBA_TABTYPE(table_type_id)

功能:属于DBA诊断函数,用于返回表类型ID对应的表类型名。

说明:

  • 该函数为诊断函数,如果表类型ID不存在,将返回UNKNOWN_TYPE。

  • table_type_id为表类型ID:

    • 0:HEAP,普通表(堆表)

    • 1:IOT,索引组织表

    • 2:TRANS_TEMP,事务型临时表

    • 3:SESSION_TEMP,会话型临时表

    • 4:NOLOGGING,无日志表

    • 5:EXTERNAL,外部表

示例:

返回表类型ID对应的表类型名。

SELECT DBA_TABTYPE(3);

DBA_TABTYPE(3)
----------------------------------------------------------------
SESSION_TEMP

1 rows fetched.

DBA_USER_NAME

语法:

DBA_USER_NAME(user_id)

功能:属于DBA诊断函数,用于返回用户ID对应的用户名。

说明:

  • 该函数为诊断函数,如果用户ID不存在,会返回用户不存在的报错信息。

  • user_id为整数类型。

示例:

返回用户ID对应的用户名。

select dba_user_name(1);

DBA_USER_NAME(1)
----------------------------------------------------------------
PUBLIC

1 rows fetched.

DECODE_NAME

语法:

DECODE_NAME(INDEX_NAME)

功能:去除相同索引或约束的oid部分。

当设置ENABLE_IDX_CONFS_NAME_DUPL参数为TRUE时,允许不同表使用相同的索引名或约束名。使用DECODE_NAME函数可以返回不带oid的索引名称。

说明:必须开启ENABLE_IDX_CONFS_NAME_DUPL功能,否则返回索引名和约束名不变化。

示例:

返回不带oid的索引。

--删除表T_DUPL_INDEX_1。
DROP TABLE IF EXISTS T_DUPL_INDEX_1;
--创建表T_DUPL_INDEX_1。
CREATE TABLE T_DUPL_INDEX_1
  (
   	F_INT1 INT,
   	F_INT2 INT,
   	F_CHAR1 CHAR(20)
  );
--创建索引INDEX_DUPL_INDEX。
CREATE INDEX INDEX_DUPL_INDEX ON T_DUPL_INDEX_1(F_INT1);
--创建唯一约束。
CREATE UNIQUE INDEX INDEX_CHAR_DUPL_INDEX ON T_DUPL_INDEX_1(F_CHAR1);
--删除表T_DUPL_INDEX_2。
DROP TABLE IF EXISTS T_DUPL_INDEX_2;
--创建表T_DUPL_INDEX_2。
CREATE TABLE T_DUPL_INDEX_2
 (
  	F_INT1 INT,
  	F_INT2 INT,
  	F_CHAR1 CHAR(20)
  );
--创建索引INDEX_DUPL_INDEX。
CREATE INDEX INDEX_DUPL_INDEX ON T_DUPL_INDEX_2(F_INT1);
--创建唯一约束。
CREATE UNIQUE INDEX INDEX_CHAR_DUPL_INDEX ON T_DUPL_INDEX_2(F_CHAR1);
--查找索引名称相同的索引(带oid)和表名。
SELECT INDEX_NAME,TABLE_NAME FROM USER_INDEXES WHERE INDEX_NAME LIKE 'INDEX_DUPL_INDEX%' ORDER BY TABLE_NAME;
INDEX_NAME                                                       TABLE_NAME                                                      
---------------------------------------------------------------- ----------------------------------------------------------------
INDEX_DUPL_INDEX_2079#                                           T_DUPL_INDEX_1                                                  
INDEX_DUPL_INDEX_2080#                                           T_DUPL_INDEX_2                                                  

2 rows fetched.
--查找索引名称相同的索引和表名使用DECODE_NAME函数,去掉索引后缀oid部分。
SELECT DECODE_NAME(INDEX_NAME), TABLE_NAME FROM USER_INDEXES WHERE INDEX_NAME LIKE 'INDEX_CHAR_DUPL_INDEX%' ORDER BY TABLE_NAME;

DECODE_NAME(INDEX_NAME)                                          TABLE_NAME                                                      
---------------------------------------------------------------- ----------------------------------------------------------------
INDEX_CHAR_DUPL_INDEX                                            T_DUPL_INDEX_1                                                  
INDEX_CHAR_DUPL_INDEX                                            T_DUPL_INDEX_2                                                  

2 rows fetched.

FOUND_ROWS

语法:

FOUND_ROWS()

功能:返回一条带有LIMIT子句的SELECT语句被执行用于筛选一部分结果的同时又想知道完整的结果集(即包含被LIMIT过滤的结果)的行数。

说明:

  • 如果在一条未指定SQL_CALC_FOUND_ROWS的SELECT语句后调用FOUND_ROWS(),则FOUND_ROWS()返回的行数就是SELECT语句自身返回的结果集行数,将不会包含受LIMIT子句影响被过滤的行数 。

  • 对于UNION或UNION ALL或MINUS语句,FOUND_ROWS()只对全局LIMIT子句有影响。对于各个SELECT子集中出现的LIMIT语句则不会产生影响。

  • 如果执行FOUND_ROWS()函数之前该会话尚未执行过SELECT语句,或之前执行的SELECT语句失败了,又或之前执行的是一个更新语句,这类情况下FOUND_ROWS()函数的返回值未定义。通常情况下会返回一个“0”。

示例:

返回staff_id>1的员工个数。
--删除表employee。
DROP TABLE IF EXISTS employee;
--创建表employee。
CREATE TABLE employee(staff_id INT NOT NULL, first_name VARCHAR(64));
--加入数据。
INSERT INTO employee(staff_id,first_name) values ('1', 'Alice');
INSERT INTO employee(staff_id,first_name) values ('2', 'Jack');
INSERT INTO employee(staff_id,first_name) values ('3', 'Brown');
--提交事务。
COMMIT;
--查找staff_id > 1的人。
SELECT * FROM employee where staff_id>1;

STAFF_ID     FIRST_NAME
------------ ----------------------------------------------------------------
2            Jack
3            Brown

2 rows fetched.
--返回满足条件的行数。
SELECT FOUND_ROWS();

FOUND_ROWS()
--------------------
2

1 rows fetched.

GET_DISTRIBUTE_STR

该函数只在分布式场景使用,单机场景返回为空。

GET_LOCK

语法:

GET_LOCK(name_expr [, timeout_expr])

功能:GET_LOCK() 为一个会话获取一把锁名为name_expr的咨询锁(advisory lock),之后另一个会话若也调用GET_LOCK()尝试获取同名锁时,将会等待timeout_expr所指定的秒数。如果在此期间内第一个会话释放了锁,则第二个会话将能成功获取锁;如果时间超过指定的超时秒数后第一个会话仍未释放锁,则第二个会话获取锁的尝试失败。

GET_LOCK()的返回值如下:

  • 1: 成功获取到锁。

  • 0: 未能获取到锁。

通过GET_LOCK()获取到的锁可通过以下两种方式释放:

  • 显式释放:通过调用RELEASE_LOCK()释放。

  • 隐式释放:会话中断(不论正常或异常)时该会话占有的锁自动释放。

说明:

  • 表示锁名的name_expr的计算结果的字符串长度不能超过64字节。

  • 同一个会话同时最多可以加32把锁。

  • 同一会话可以多次对同一个锁名上锁,这种情况下,需要对该锁名解锁同样的次数。对同一锁名多次加锁时,第二次加锁开始的次数并不计入上述所说的32把锁的个数。

  • timeout_expr未指定或指定为一个负值时,GET_LOCK()获取不到锁时将一直等待。

示例:

对表中某一列进行加锁。

--删除表employee。
DROP TABLE IF EXISTS employee;
--创建表employee。
CREATE TABLE employee(staff_id INT NOT NULL, first_name VARCHAR(64));
--加入数据。
INSERT INTO employee(staff_id,first_name) values ('1', 'Alice');
INSERT INTO employee(staff_id,first_name) values ('2', 'Jack');
INSERT INTO employee(staff_id,first_name) values ('3', 'Brown');
--提交事务。
COMMIT;
--对'staff_id'列加锁。
SELECT GET_LOCK('staff_id',5);

GET_LOCK('STAFF_ID',5)
--------------------
1

1 rows fetched.

GREATEST

语法:

GREATEST( expr1 [, expr2, ... expr_n] )

功能:GREATEST函数返回一个或多个表达式中的最大的值。

  • 返回值类型与expr1的数据类型相同。

  • expr1:要评估的第一个表达式是否是最大的。

  • expr2,... expr_n可选的,要评估的其他表达式。

示例:

SELECT GREATEST(2, 5, 12, 3);

GREATEST(2, 5, 12, 3)
---------------------
12

1 rows fetched.

SELECT GREATEST('2', '5', '12', '3');

GREATEST('2', '5', '12', '3')
-----------------------------
5

1 rows fetched.

SELECT GREATEST('apples', 'oranges', 'bananas');

GREATEST('APPLES', 'ORANGES', 'BANANAS')
----------------------------------------
oranges

1 rows fetched.

SELECT GREATEST('apples', 'applis', 'applas');

GREATEST('APPLES', 'APPLIS', 'APPLAS')
--------------------------------------
applis

1 rows fetched.

LAST_INSERT_ID

语法:

LAST_INSERT_ID([expr])

功能:

  1. 参数为空时:返回当前回话最后一次INSERT语句AUTO_INCREMENT列自动生成的值。

  2. 如果指定expr参数,则该函数返回参数的值,并将其记住为LAST_INSERT_ID() 返回的下一个值。

示例:

返回最后一条INSERT语句AUTO_INCREMENT列自动生成的值。

--删除表employee。
DROP TABLE IF EXISTS employee;
--创建表employee。
CREATE TABLE employee(staff_id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,first_name VARCHAR(10));
--加入数据。
INSERT INTO employee VALUES (NULL, 'Bob');
INSERT INTO employee VALUES (NULL, 'BROWN');
INSERT INTO employee VALUES (NULL, 'ALICE');
--返回最后一条INSERT语句AUTO_INCREMENT列自动生成的值。
SELECT LAST_INSERT_ID();

LAST_INSERT_ID()
--------------------
3

1 rows fetched.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3163939/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-01-06

  • 博文量
    2907
  • 访问量
    19342