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();