DBMS_UTILITY内置包提供了多种工具类子程序。
BMS_UTILITY子程序总览
子程序 | 说明 |
ANALYZE_DATABASE Procedure | 分析数据库中的表。 |
ANALYZE_SCHEMA Procedure | 分析schema中的表。 |
ANALYZE_PART_OBJECT Procedure | 分析单张表。 |
CANONICALIZE Procedure | 规范化给定的字符串。 |
COMMA_TO_TABLE Procedure | 将逗号分隔的名称标识符列表转换为名称表。 |
DB_VERSION Procedure | 获取数据库版本。 |
EXEC_DDL_STATEMENT Procedure | 执行DDL语句。 |
FORMAT_CALL_STACK Function | 格式化当前调用栈。 |
FORMAT_ERROR_BACKTRACE Function | 格式化从当前的错误点到捕获错误的异常处理程序的堆栈信息。 |
FORMAT_ERROR_STACK Function | 格式化当前错误栈。 |
GET_CPU_TIME Function | 返回当前的CPU时间(以百分之一秒为单位)。 |
GET_DEPENDENCY Procedure | 显示传入对象的依赖关系。 |
GET_HASH_VALUE Function | 计算给定字符串的哈希值。 |
GET_PARAMETER_VALUE Function | 获取数据库初始化参数设置。 |
GET_TIME Function | 返回当前的时钟时间(以百分之一秒为单位)。 |
NAME_TOKENIZE Procedure | 将给定名称解析为其组成部分。 |
TABLE_TO_COMMA Procedure | 将名称标识符的表转为逗号分隔的列表。 |
DBMS_UTILITY数据类型
LNAME_ARRAY
LNAME_ARRAY用于存储长名称(包括完全限定名称)的列表。
TYPE LNAME_ARRAY IS TABLE OF VARCHAR2(4000);
UNCL_ARRAY
UNCL_ARRAY用于存储名称标识符的列表。
TYPE UNCL_ARRAY IS TABLE OF VARCHAR2(227);
ANALYZE_DATABASE
该存储过程用于分析数据库中的表。
语法
DBMS_UTILITY.ANALYZE_DATABASE (
method IN VARCHAR2,
estimate_rows IN INTEGER DEFAULT NULL,
estimate_percent IN INTEGER DEFAULT NULL,
method_opt IN VARCHAR2 DEFAULT NULL);
参数说明
参数 | 说明 |
method | 指定ANALYZE的方法。取值如下:
COMPUTE 和 ESTIMATE之间没有差异,都是执行ANALYZE语句。其他参数均为兼容性提供参数,执行时会被忽略。 |
estimate_rows | (可选参数)估计统计信息所依据的行数。 |
estimate_percent | (可选参数)估计统计信息所依据的行百分比。 |
method_opt | (可选参数)分析的对象类型。 |
示例
CALL DBMS_UTILITY.ANALYZE_DATABASE('COMPUTE');
ANALYZE_SCHEMA
该存储过程用于分析schema中的表。
语法
DBMS_UTILITY.ANALYZE_SCHEMA (
schema IN VARCHAR2,
method IN VARCHAR2,
estimate_rows IN INTEGER DEFAULT NULL,
estimate_percent IN INTEGER DEFAULT NULL,
method_opt IN VARCHAR2 DEFAULT NULL);
参数说明
参数 | 说明 |
schema | schema的名称。 |
method | 指定ANALYZE的方法。取值如下:
COMPUTE和ESTIMATE之间没有差异,都是执行ANALYZE语句。除去schema和method以外的参数均为兼容性提供参数,执行时会被忽略。 |
estimate_rows | (可选参数)估计统计信息所依据的行数。 |
estimate_percent | (可选参数)估计统计信息所依据的行百分比。 |
method_opt | (可选参数)分析的对象类型。 |
示例
CALL DBMS_UTILITY.ANALYZE_SCHEMA('public', 'compute');
ANALYZE_PART_OBJECT
该存储过程用于分析单张表。
语法
DBMS_UTILITY.ANALYZE_PART_OBJECT (
schema IN VARCHAR2 DEFAULT NULL,
object_name IN VARCHAR2 DEFAULT NULL,
object_type IN CHAR DEFAULT 'T',
command_type IN CHAR DEFAULT 'E',
command_opt IN VARCHAR2 DEFAULT NULL,
sample_clause IN VARCHAR2 DEFAULT 'sample 5 percent ');
参数说明
参数 | 说明 |
schema | 待分析对象的schema名称。 |
object_name | 待分析对象。 |
object_type | (可选参数)待分析对象类型。 |
command_type | (可选参数)需要执行的分析功能类型。 |
command_opt | (可选参数)command_type使用的可选值。 |
sample_clause | (可选参数)command_type为 |
除了schema和object_name,其他参数均为兼容性提供参数,执行时会被忽略。
示例
CALL DBMS_UTILITY.analyze_part_object('public', 'table2');
CANONICALIZE
该存储过程用于规范化一个给定的字符串。
语法
DBMS_UTILITY.CANONICALIZE(
name IN VARCHAR2,
canon OUT VARCHAR2,
canon_len IN INTEGER);
参数说明
参数 | 说明 |
name | 待规范化的字符串。 |
canon | 完成规范化的字符串。 |
canon_len | name中从第一个字符开始待规范化的字节数量。 |
示例
该示例展示了如何规范化一个给定的字符串。
DECLARE
name varchar2 default 'aBc."dEf"."ghi"';
length integer default 50;
canon varchar2;
BEGIN
DBMS_UTILITY.CANONICALIZE(name,canon,length);
DBMS_OUTPUT.PUT_LINE(canon);
END;
-- "ABC"."dEf"."ghi"
COMMA_TO_TABLE
该存储过程用于将逗号分隔的名称列表转换为名称表。
语法
DBMS_UTILITY.COMMA_TO_TABLE (
list IN VARCHAR2,
tablen OUT INTEGER,
tab OUT UNCL_ARRAY);
参数说明
参数 | 说明 |
list | 以逗号分隔的名称标识符列表。 |
tablen | tab中的条目数量。 |
tab | 包含list中的各个名称的表。 |
示例
该示例展示了如何将逗号分隔的名称列表转换为名称表。
DECLARE
lname DBMS_UTILITY.LNAME_ARRAY;
length integer;
list varchar2;
BEGIN
list := 'a.b.c.d , b , c , select1';
DBMS_UTILITY.COMMA_TO_TABLE(list,length,lname);
FOR i IN 1..length LOOP
DBMS_OUTPUT.PUT_LINE('-> ' || lname(i) || '<- ' || length(lname(i)));
END LOOP;
DBMS_OUTPUT.PUT_LINE('-- finished --');
END;
-> a.b.c.d <- 8
-> b <- 3
-> c <- 3
-> select1 <- 8
-- finished --
DB_VERSION
该存储过程用于获取数据库的版本信息。
语法
DBMS_UTILITY.DB_VERSION (
version OUT VARCHAR2,
compatibility OUT VARCHAR2);
参数说明
参数 | 说明 |
version | 数据库版本。 |
compatibility | 数据库兼容性设置(忽略)。 |
示例
该示例展示了如何获取数据库的版本信息。
DECLARE
version varchar2(100);
compatibility varchar2(100);
BEGIN
DBMS_UTILITY.DB_VERSION(version, compatibility);
DBMS_OUTPUT.PUT_LINE(version);
DBMS_OUTPUT.PUT_LINE(compatibility);
END;
-- PostgreSQL 14.8 (PolarDB 14.8.10.0 build 0d3bf26c debug)
-- PostgreSQL 14.8 (PolarDB 14.8.10.0 build 0d3bf26c debug)
EXEC_DDL_STATEMENT
该存储过程用于执行DDL语句。
语法
DBMS_UTILITY.EXEC_DDL_STATEMENT (
parse_string IN VARCHAR2);
参数说明
参数 | 说明 |
parse_string | 待执行的DDL语句。 |
示例
该示例展示了如何通过该存储过程执行DDL语句。
CALL DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE test(a int, b varchar2(20))');
SELECT * FROM test;
a | b
---+---
(0 rows)
FORMAT_CALL_STACK
该函数用于格式化当前的调用栈。
语法
DBMS_UTILITY.FORMAT_CALL_STACK();
RETURN VARCHAR2;
返回值
返回值 | 说明 |
VARCHAR2 | 格式化后的调用栈信息。 |
示例
该示例展示了如何输出当前的调用栈的格式化信息。
CREATE FUNCTION func() RETURNS varchar2
IS
BEGIN
return dbms_utility.format_call_stack();
END;
select * from func();
func
--------------------------------------------------
----- PL/SQL Call Stack ----- +
object line object +
handle number name +
0 2 function format_call_stack()+
17089 2 function func()
(1 row)
FORMAT_ERROR_BACKTRACE
该函数用于格式化从当前的错误点到捕获错误的异常处理程序的堆栈信息。
语法
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE()
RETURN VARCHAR2;
返回值
返回值 | 说明 |
VARCHAR2 | 回溯的堆栈信息。 |
示例
该示例创建了一个函数的调用链,被调用函数抛出异常,调用方捕获异常,并通过FORMAT_ERROR_BACKTRACE
打印错误堆栈信息。
CREATE FUNCTION inner(a integer) RETURNS integer
IS
DECLARE
res integer;
BEGIN
res = a/0;
RETURN res;
EXCEPTION
WHEN others THEN
RAISE EXCEPTION 'expected exception';
END;
CREATE FUNCTION outer() RETURNS integer
IS
BEGIN
return inner(100);
EXCEPTION
WHEN others THEN
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE());
return -1;
END;
SELECT outer() FROM dual;
----- Error Stack -----
ERR-33816706: division by zero
PL/SQL function "inner"(integer) line 4 at assignment
PL/SQL function "outer"() line 2 at RETURN
ERR-16777248: expected exception
PL/SQL function "inner"(integer) line 8 at RAISE
PL/SQL function "outer"() line 2 at RETURN
FORMAT_ERROR_STACK
该函数用于格式化当前的错误栈。
语法
DBMS_UTILITY.FORMAT_ERROR_STACK
RETURN VARCHAR2;
返回值
返回值 | 说明 |
VARCHAR2 | 格式化后的错误调用栈信息。 |
示例
该示例创建了一个函数的调用链,被调用函数抛出异常,调用方捕获异常,并通过FORMAT_ERROR_STACK
打印错误栈信息。
CREATE FUNCTION inner(a integer) RETURNS integer
IS
DECLARE
res integer;
BEGIN
res = a/0;
RETURN res;
EXCEPTION
WHEN others THEN
RAISE EXCEPTION 'expected exception';
END;
CREATE FUNCTION outer() RETURNS integer
IS
BEGIN
return inner(100);
EXCEPTION
WHEN others THEN
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK());
return -1;
END;
SELECT outer() FROM dual;
----- Error Stack -----
ERR-33816706: division by zero
PL/SQL function "inner"(integer) line 4 at assignment
PL/SQL function "outer"() line 2 at RETURN
ERR-16777248: expected exception
PL/SQL function "inner"(integer) line 8 at RAISE
PL/SQL function "outer"() line 2 at RETURN
GET_CPU_TIME
该函数用于返回当前的CPU时间。
语法
DBMS_UTILITY.GET_CPU_TIME
RETURN INTEGER;
返回值
返回值 | 说明 |
INTEGER | 任意时间点的CPU时间(百分之一秒为单位)。 |
示例
该示例展示了在程序sleep前后的CPU时间(两个CPU时间的差值远小于程序的sleep时间)。
BEGIN
DBMS_OUTPUT.PUT_LINE('start cpu time:' || DBMS_UTILITY.GET_CPU_TIME());
-- start cpu time:11
DBMS_SESSION.SLEEP(5);
DBMS_OUTPUT.PUT_LINE('end cpu time:' || DBMS_UTILITY.GET_CPU_TIME());
-- end cpu time:11
END;
GET_DEPENDENCY
该存储过程用于显示传入对象的依赖关系。
语法
DBMS_UTILITY.GET_DEPENDENCY
type IN VARCHAR2,
schema IN VARCHAR2,
name IN VARCHAR2);
参数说明
参数 | 说明 |
type | name的对象类型。 |
schema | name所在的schema的名称。 |
name | 待获取依赖项的对象的名称。 |
示例
该示例创建了一张表,并在此基础上创建了一张视图,通过该存储过程查看该视图的依赖关系。
CREATE TABLE t(a int, b int);
CREATE VIEW v AS SELECT a, b FROM t;
CALL DBMS_UTILITY.GET_DEPENDENCY('view','public','v');
-- TABLE T
GET_HASH_VALUE
该函数用于计算给定字符串的哈希值。
语法
DBMS_UTILITY.GET_HASH_VALUE (
name VARCHAR2,
base INTEGER,
hash_size INTEGER)
RETURN INTEGER;
参数说明
参数 | 说明 |
name | 待计算哈希值的字符串。 |
base | 返回的哈希值的起始基值。 |
hash_size | 返回的哈希值的范围。 |
返回值
返回值 | 说明 |
INTEGER | 生成的哈希值。 |
示例
该示例展示了如何计算给定字符串的哈希值(该示例计算给定字符串在1到99内的哈希值)。
SELECT DBMS_UTILITY.GET_HASH_VALUE('PolarDB', 1, 100) FROM dual;
get_hash_value
----------------
67
(1 row)
GET_PARAMETER_VALUE
该函数用于获取数据库初始化参数设置。
语法
DBMS_UTILITY.GET_PARAMETER_VALUE (
parnam IN VARCHAR2,
intval OUT INTEGER,
strval OUT VARCHAR2)
RETURN INTEGER;
参数说明
参数 | 说明 |
parnam | 需要返回其值的参数的名称。pg_settings系统视图中列出了这些参数。 |
intval | 整数参数的值或strval的长度。 |
strval | 字符串参数的值。 |
返回值
返回值 | 说明 |
INTEGER | 如果参数值为INTEGER,返回0。否则返回1。 |
示例
该示例展示了通过该函数获取字符串和整数类型的参数。
DECLARE
intval INTEGER;
strval VARCHAR2(80);
ret INTEGER;
BEGIN
ret := DBMS_UTILITY.GET_PARAMETER_VALUE('client_encoding', intval, strval);
DBMS_OUTPUT.PUT_LINE('ret is: ' || ret || '; intval is: ' || intval || '; strval is: ' || strval);
ret := DBMS_UTILITY.GET_PARAMETER_VALUE('block_size', intval, strval);
DBMS_OUTPUT.PUT_LINE('ret is: ' || ret || '; intval is: ' || intval || '; strval is: ' || strval);
END;
ret is: 1; intval is: 4; strval is: UTF8
ret is: 0; intval is: 8192; strval is:
GET_TIME
该函数用于返回当前的时间。
语法
DBMS_UTILITY.GET_TIME
RETURN INTEGER;
返回值
返回值 | 说明 |
INTEGER | 任意时间点的时钟时间(百分之一秒为单位)。 |
示例
该示例展示了通过GET_TIME获取程序执行前后的时间差。
DECLARE
start_time integer;
end_time integer;
BEGIN
start_time := DBMS_UTILITY.GET_TIME;
DBMS_LOCK.SLEEP(5);
end_time := DBMS_UTILITY.GET_TIME;
DBMS_OUTPUT.PUT_LINE('total time is:' || end_time - start_time);
END;
NAME_TOKENIZE
该存储过程用于将给定名称解析为其组成部分。
语法
DBMS_UTILITY.NAME_TOKENIZE (
name IN VARCHAR2,
a OUT VARCHAR2,
b OUT VARCHAR2,
c OUT VARCHAR2,
dblink OUT VARCHAR2,
nextpos OUT INTEGER);
参数说明
参数 | 说明 |
name | 输入的名称。由SQL标识符组成,格式为a [ . b [ . c ] ] [ @ dblink ]。 |
a | name中的第一个标识符。 |
b | name中的第二个标识符。 |
c | name中的第三个标识符。 |
dblink | name中的dblink部分。 |
nextpos | 完成输入name解析后的下一个字符位置 |
示例
该示例展示了如何通过该存储过程进行名称的解析。
DECLARE
a varchar2;
b varchar2;
c varchar2;
dblink varchar2;
nextpos integer;
name varchar2;
BEGIN
name := 'sch.tbl@dblink';
DBMS_UTILITY.NAME_TOKENIZE(name, a, b, c, dblink, nextpos);
DBMS_OUTPUT.PUT_LINE('name : ' || name);
DBMS_OUTPUT.PUT_LINE('a : ' || a);
DBMS_OUTPUT.PUT_LINE('b : ' || b);
DBMS_OUTPUT.PUT_LINE('c : ' || c);
DBMS_OUTPUT.PUT_LINE('dblink : ' || dblink);
DBMS_OUTPUT.PUT_LINE('nextpos: ' || nextpos);
END;
name : sch.tbl@dblink
a : SCH
b : TBL
c :
dblink : DBLINK
nextpos: 14
TABLE_TO_COMMA
该存储过程用于将名称标识符的表转为逗号分隔的列表。
语法
DBMS_UTILITY.TABLE_TO_COMMA (
tab IN UNCL_ARRAY,
tablen OUT INTEGER,
list OUT VARCHAR2);
参数说明
参数 | 说明 |
tab | 包含名称标识符的表。 |
tablen | tab中的条目数量。 |
list | 以逗号分隔的名称列表。 |
示例
该示例展示了如何将包含名称的表转为逗号分隔的形式。
DECLARE
result varchar2;
length integer;
list dbms_utility.lname_array;
BEGIN
list := dbms_utility.lname_array('name1', 'name2', 'name3');
DBMS_UTILITY.TABLE_TO_COMMA(list, length, result);
DBMS_OUTPUT.PUT_LINE('result is: ' || result || '; length is: ' || length );
END;
-- result is: name1,name2,name3; length is: 3