DBMS_UTILITY包¶
DBMS_UTILITY包中含有部分兼容Oracle的DBMS_UTILITY系统包的函数/过程以及神通数据库部分系统工具函数/过程。
表7展示了DBMS_UTILITY包的子程序。
| 子程序 | 说明 |
|---|---|
| 过程ANALYZE_SCHEMA | 分析数据库所有的模式信息(兼容Oracle) |
| 过程ANALYZE_DATABASE | 分析数据库所有的表信息(兼容Oracle) |
| 过程ANALYZE_INDEX | 分析数据库所有的索引信息,为用户提供索引信息以及碎片整理等功能 |
| 过程COMPILE_SCHEMA | 编译指定模式下的无效对象 |
| 函数format_call_stack( ) | 输出当前的调用堆栈 |
| 函数format_error_backtrace( ) | 打印从错误发生点到错误被捕获到的点的堆栈 |
| 函数format_error_stack( ) | 从发生错误到当前exception处理块发生的所有错误 |
| 函数get_time() | 返回当前时间(10ms为单位),用于计算时间差 |
| 函数get_hash_value() | 计算给定字符串的哈希值 |
以下介绍了各种过程的语法、参数和说明。
注解
函数get_time():函数的返回值范围是-2147483648 到 2147483647,2^32/24/60/60/100约等于497。因此如果一台机器开机时间超过 497 天,返回值就会变为负数。
由于该函数主要是在程序中被多次调用来计算时间差的,因此计算时间差程序的逻辑需要考虑一正一负的情况,建议按照下面的示例来获取准确的时间差
示例:
以神通数据库函数format_call_stack( )为例,查看如何输出当前的调用堆栈:
select dbms_utility.format_call_stack from dual;
FORMAT_CALL_STACK
-------------------------------------
----- PL/SQL Call Stack -----
object line object
handle number name
18213 1 anonymous block
(1 row)
以神通数据库get_time()为例,用于计算系统时间差
drop procedure test_get_time cascade;
drop procedure my_sys_proc cascade;
CREATE OR REPLACE FUNCTION get_difftime(A INT,B INT) RETURN INT AS
BEGIN
IF (B<0 AND A>0) THEN
RETURN (-A-B);
ELSE
RETURN (B-A);
END IF;
END;
/
CREATE OR REPLACE PROCEDURE test_get_time() AS
A INT;
B INT;
C INT;
str varchar(100);
BEGIN
复制sys_proc用时(int) |
-----------------------
13 |
总数目:1
A = DBMS_UTILITY.GET_TIME();
str := 'CREATE TABLE my_sys_proc as SELECT * FROM sys_proc';
execute immediate str;
B = DBMS_UTILITY.GET_TIME();
---单独使用DBMS_UTILITY.GET_TIME(),无意义,主要用于计算时间差,如下sql的时间差为
select get_difftime(A,B) as "复制sys_proc用时" from dual;
END;
/
EXEC test_get_time();