DBE_UTILITY
接口介绍
高级功能包DBE_UTILITY支持的所有接口请参见表1。
| 接口名称 | 描述 |
|---|---|
| 输出函数异常的调用堆栈。 | |
| 输出函数异常的具体信息。 | |
| 输出函数的调用堆栈。 | |
| 输出当前时间,一般用于做差得到执行时长。 | |
| 用于给表名字符串做规范。 | |
| 将用逗号隔开的名字列表的字符串转换为PL/SQL表名称列表。 | |
| 返回数据库的版本号和兼容性版本号。 | |
| 用于执行用户输入的DDL语句。 | |
| 用于展开SQL查询的视图。 | |
| 返回当前CPU处理时间的测量值。 | |
| 用于获取数据库所在平台字节序的大小端信息。 | |
| 返回一个给定字符串的hash值。 | |
| 输出一个给定字符串的hash值,该存储过程在不打开proc_outparam_override时使用。 | |
| 用于检查参数n是否存在于r。 | |
| 用于判断当前数据库是否在数据库集群模式下运行。 | |
| 解析给定的对象名称,包括同义词翻译和必要的授权检查。 | |
| 用于解析a [. b [. c ]][@ dblink ]形式的名字。 | |
| 返回当前用户环境下的数据库模式名称。 | |
| 返回当前用户的名称。 | |
| 将PL/SQL中的表名转换为用逗号隔开的名字列表的字符串。 | |
| 功能同DBE_UTILITY.GET_SQL_HASH,该函数在打开proc_outparam_override时使用。 |
- DBE_UTILITY.FORMAT_ERROR_BACKTRACE
函数FORMAT_ERROR_BACKTRACE返回在执行过程中出现错误时,出现错误位置的调用堆栈。DBE_UTILITY.FORMAT_ERROR_BACKTRACE函数原型为:
DBE_UTILITY.FORMAT_ERROR_BACKTRACE() RETURN TEXT;
- DBE_UTILITY.CANONICALIZE
存储过程CANONICALIZE用于给表名字符串做规范。该过程处理单个保留字或关键字,并删除单个标识符的空白,以便“table”成为TABLE。DBE_UTILITY.CANONICALIZE函数原型为:
DBE_UTILITY.CANONICALIZE( name IN VARCHAR2, canon_name OUT VARCHAR2, canon_len IN BINARY_INTEGER DEFAULT 1024 );表2 DBE_UTILITY.CANONICALIZE接口说明 参数名称
类型
入参/出参
是否可以为空
描述
name
VARCHAR2
IN
否
待规范的字符串。
canon_name
VARCHAR2
OUT
是
规范好的字符串。
canon_len
BINARY_INTEGER
IN
是
要规范的字符串长度,默认值为1024(以字节为单位)。若此参数的值小于待规范的字符串的实际长度(字节),则会以字节为粒度截断字符串。
- DBE_UTILITY.COMMA_TO_TABLE
存储过程COMMA_TO_TABLE将用逗号隔开的名字列表的字符串转换为PL/SQL表名称列表。DBE_UTILITY.COMMA_TO_TABLE函数原型为:
DBE_UTILITY.COMMA_TO_TABLE ( list IN VARCHAR2, tablen OUT BINARY_INTEGER, tab OUT VARCHAR2[] );表3 DBE_UTILITY.COMMA_TO_TABLE接口说明 参数名称
类型
入参/出参
是否可以为空
描述
list
VARCHAR2
IN
否
逗号隔开的名字列表字符串。
tablen
BINARY_INTEGER
OUT
是
列表名字的个数。
tab
VARCHAR2
OUT
是
转换后的表名称列表。
- DBE_UTILITY.DB_VERSION
存储过程DB_VERSION返回数据库的版本号和兼容性版本号。DBE_UTILITY.DB_VERSION函数原型为:
DBE_UTILITY.DB_VERSION ( version OUT VARCHAR2 );表4 DBE_UTILITY.DB_VERSION接口说明 参数名称
类型
入参/出参
是否可以为空
描述
version
VARCHAR2
OUT
否
输出参数,表示内部的数据库软件版本信息,是一个字符串。
- DBE_UTILITY.EXEC_DDL_STATEMENT
使用EXECUTE DIRECT ON语法执行DBE_UTILITY.EXEC_DDL_STATEMENT函数,如果GUC参数enable_udf_execute_direct的值为on,则可以执行;否则不可以执行。
存储过程EXEC_DDL_STATEMENT用于执行用户输入的DDL语句。DBE_UTILITY.EXEC_DDL_STATEMENT函数原型为:
DBE_UTILITY.EXEC_DDL_STATEMENT ( parse_string IN TEXT );表5 DBE_UTILITY.EXEC_DDL_STATEMENT接口说明 参数名称
类型
入参/出参
是否可以为空
描述
parse_string
TEXT
IN
是
需要执行的DDL语句。
- DBE_UTILITY.EXPAND_SQL_TEXT_PROC
存储过程EXPAND_SQL_TEXT_PROC用于展开SQL查询的视图,会递归展开视图中的视图对象,一直展开显示到表。DBE_UTILITY.EXPAND_SQL_TEXT_PROC函数原型为:
DBE_UTILITY.EXPAND_SQL_TEXT_PROC ( input_sql_text IN CLOB, output_sql_text OUT CLOB );表6 DBE_UTILITY.EXPAND_SQL_TEXT_PROC接口说明 参数名称
类型
入参/出参
是否可以为空
描述
input_sql_text
CLOB
IN
否
输入的SQL文本。
output_sql_text
CLOB
OUT
否
输出展开视图的SQL文本。
用户输入的input_sql_text参数中,SQL语句中的对象需要增加schema前缀,否则函数会报无法找到对象的错误。若设置behavior_compat_options参数值为bind_procedure_searchpath,则无需强制指定schema前缀。
- DBE_UTILITY.GET_CPU_TIME
函数GET_CPU_TIME返回当前CPU处理时间的测量值(以百分之一秒为单位)。DBE_UTILITY.GET_CPU_TIME函数原型为:
DBE_UTILITY.GET_CPU_TIME() RETURN BIGINT;
- DBE_UTILITY.GET_ENDIANNESS
函数GET_ENDIANNESS用于获取数据库所在平台字节序的大小端信息。DBE_UTILITY. GET_ENDIANNESS函数原型为:
DBE_UTILITY.GET_ENDIANNESS RETURN INTEGER;
- DBE_UTILITY.GET_HASH_VALUE
函数GET_HASH_VALUE返回一个给定字符串的hash值。DBE_UTILITY.GET_HASH_VALUE函数原型为:
DBE_UTILITY.GET_HASH_VALUE( name IN VARCHAR2(n), base IN INTEGER, hash_size IN INTEGER) RETURN INTEGER;表7 DBE_UTILITY.GET_HASH_VALUE接口说明 参数名称
类型
入参/出参
是否可以为空
描述
name
VARCHAR2
IN
否
待哈希转换的字符串。
base
INTEGER
IN
否
返回的哈希值的起始值。
hash_size
INTEGER
IN
否
哈希映射到的哈希表的大小。
- DBE_UTILITY.GET_SQL_HASH
存储过程GET_SQL_HASH通过MD5算法输出一个给定字符串的hash值。DBE_UTILITY.GET_SQL_HASH函数原型为:
DBE_UTILITY.GET_SQL_HASH( name IN VARCHAR2, hash OUT RAW, last4bytes OUT BIGINT )RETURN BIGINT;表8 DBE_UTILITY.GET_SQL_HASH接口说明 参数名称
类型
入参/出参
是否可以为空
描述
name
VARCHAR2
IN
否
待哈希转换的字符串。
hash
RAW
OUT
否
完整的16进制MD5哈希值。
last4bytes
BIGINT
OUT
否
MD5哈希值的最后四字节,以无符号整数形式展现。
设置behavior_compat_options参数值为非proc_outparam_override值后,请调用DBE_UTILITY.GET_SQL_HASH函数,如调用DBE_UTILITY.GET_SQL_HASH_FUNC则会发生赋值不成功。
- DBE_UTILITY.IS_BIT_SET
函数IS_BIT_SET用于检查参数n是否存在于r。DBE_UTILITY. IS_BIT_SET函数原型为:
DBE_UTILITY.IS_BIT_SET ( r IN RAW, n IN INTEGER) RETURN INTEGER;表9 DBE_UTILITY.IS_BIT_SET接口说明 参数名称
类型
入参/出参
是否可以为空
描述
r
RAW
IN
否
4字节加上实际的十六进制字符串。
n
INTEGER
IN
否
用于在二进制中判断是否存在该数值。
- DBE_UTILITY.IS_CLUSTER_DATABASE
函数IS_CLUSTER_DATABASE用于判断当前数据库是否在数据库集群模式下运行。DBE_UTILITY.IS_CLUSTER_DATABASE函数原型为:
DBE_UTILITY.IS_CLUSTER_DATABASE RETURN BOOLEAN;
- DBE_UTILITY.NAME_RESOLVE
存储过程NAME_RESOLVE解析给定的对象名称,包括同义词翻译和必要的授权检查。DBE_UTILITY.NAME_RESOLVE函数原型为:
DBE_UTILITY.NAME_RESOLVE ( name IN VARCHAR2, context IN INTEGER, schema OUT VARCHAR2, part1 OUT VARCHAR2, part2 OUT VARCHAR2, dblink OUT VARCHAR2, part1_type OUT INTEGER, object_number OUT OID );表10 DBE_UTILITY.NAME_RESOLVE接口说明 参数名称
类型
入参/出参
是否可以为空
描述
name
VARCHAR2
IN
否
待解析对象名,结构为[[a.]b.]c[@d]。
context
INTEGER
IN
否
待解析对象类型
- 0 - table
- 1 - function, procedure, package
- 2 - sequence
- 3 - trigger
- 4 - Java Source
- 5 - Java resource
- 6 - Java class
- 7 - type
- 8 - Java shared data
- 9 - index
schema
VARCHAR2
OUT
否
对象所在的模式。
part1
VARCHAR2
OUT
否
名称的第一部分,该字段的类型由part1_type指定。
part2
VARCHAR2
OUT
是
如果该字段不为空,则为子程序名称。
dblink
VARCHAR2
OUT
是
数据库链接。
part1_type
INTEGER
OUT
否
part1的类型:
- 5:synonym
- 7:procedure(top level)
- 8:function(top level)
- 9:package
object_number
OID
OUT
否
对象标识。object_number在ORA数据库中类型为Number,表示对象标识,而GaussDB中对象标识类型为OID,并且不支持Number到OID的隐式转换。
- DBE_UTILITY.NAME_TOKENIZE
存储过程NAME_TOKENIZE用于解析a [. b [. c ]][@ dblink ]形式的名字,如果名字带有双引号则去掉,否则变为大写字母。DBE_UTILITY.NAME_TOKENIZE函数原型为:
DBE_UTILITY.NAME_TOKENIZE ( name IN VARCHAR2, a OUT VARCHAR2, b OUT VARCHAR2, c OUT VARCHAR2, dblink OUT VARCHAR2, nextpos OUT INTEGER );
表11 DBE_UTILITY.NAME_TOKENIZE接口说明 参数名称
类型
入参/出参
是否可以为空
描述
name
VARCHAR2
IN
否
名字,由SQL标识符组成(比如,scott.foo@dblink)。
a
VARCHAR2
OUT
否
名字的第一个token。
b
VARCHAR2
OUT
是
名字的第二个token。
c
VARCHAR2
OUT
是
名字的第三个token。
dblink
VARCHAR2
OUT
是
数据库链接。
nextpos
INTEGER
OUT
否
字符串经过解析后的下一个位置。
- DBE_UTILITY.OLD_CURRENT_USER
函数OLD_CURRENT_USER返回当前用户的名称。DBE_UTILITY.OLD_CURRENT_USER函数原型为:
DBE_UTILITY.OLD_CURRENT_USER() RETURN TEXT;
- DBE_UTILITY.TABLE_TO_COMMA
存储过程TABLE_TO_COMMA将PL/SQL中的表名转换为用逗号隔开的名字列表的字符串。DBE_UTILITY.TABLE_TO_COMMA函数原型为:
DBE_UTILITY.TABLE_TO_COMMA ( tab IN VARCHAR2[], tablen OUT BINARY_INTEGER, list OUT VARCHAR2 );表12 DBE_UTILITY.TABLE_TO_COMMA接口说明 参数名称
类型
入参/出参
是否可以为空
描述
tab
VARCHAR2[]
IN
否
包含表名的结构表数组。
tablen
BINARY_INTEGER
OUT
否
结构表中的表个数。
list
VARCHAR2
OUT
否
以逗号分隔表名的字符串。
- DBE_UTILITY.GET_SQL_HASH_FUNC 函数GET_SQL_HASH_FUNC通过MD5算法输出一个给定字符串的hash值。DBE_UTILITY.GET_SQL_HASH_FUNC函数原型为:
DBE_UTILITY.GET_SQL_HASH_FUNC( name IN VARCHAR2, hash OUT RAW, last4bytes OUT BIGINT );表13 DBE_UTILITY.GET_SQL_HASH_FUNC接口说明 参数名称
类型
入参/出参
是否可以为空
描述
name
VARCHAR2
IN
否
待哈希转换的字符串。
hash
RAW
OUT
否
完整的16进制MD5哈希值。
last4bytes
BIGINT
OUT
否
MD5哈希值的最后四字节,以无符号整数形式展现。
设置set behavior_compat_options = 'proc_outparam_override' 参数后,请调用DBE_UTILITY.GET_SQL_HASH_FUNC函数,如调用DBE_UTILITY.GET_SQL_HASH则会报参数不匹配异常。
示例
-- 示例1
create or replace procedure print_err() as
DECLARE
a bool;
BEGIN
a := not_exist;
exception
when others then
dbe_output.print_line('err_stack: ' || DBE_UTILITY.FORMAT_ERROR_STACK());
END;
/
CREATE PROCEDURE
call print_err();
-- 预期结果为:
err_stack: 50360452: column "not_exist" does not exist
print_err
-----------
(1 row)
-- 清理环境
drop procedure print_err;
DROP PROCEDURE
-- 示例2
create or replace procedure print_err() as
DECLARE
a bool;
BEGIN
a := not_exist;
exception
when others then
dbe_output.print_line('backtrace: ' || DBE_UTILITY.FORMAT_ERROR_BACKTRACE());
END;
/
CREATE PROCEDURE
call print_err();
-- 预期结果为:
backtrace: 50360452: PL/pgSQL function print_err() line 5 at assignment
print_err
-----------
(1 row)
-- 清理环境
drop procedure print_err;
DROP PROCEDURE
-- 示例3
create or replace procedure print_err() as
DECLARE
a bool;
BEGIN
a := not_exist;
exception
when others then
dbe_output.print_line('call_stack: ');
dbe_output.print_line(DBE_UTILITY.FORMAT_CALL_STACK());
END;
/
CREATE PROCEDURE
call print_err();
-- 预期结果为:
call_stack:
3 dbe_utility.format_call_stack()
9 print_err()
print_err
-----------
(1 row)
-- 清理环境
drop procedure print_err;
DROP PROCEDURE
-- 示例4
CREATE OR REPLACE PROCEDURE test_get_time1()
AS
declare
start_time bigint;
end_time bigint;
BEGIN
start_time:= dbe_utility.get_time ();
pg_sleep(1);
end_time:=dbe_utility.get_time ();
dbe_output.print_line(end_time - start_time);
END;
/
CREATE PROCEDURE
call test_get_time1();
-- 预期结果为:
101
test_get_time1
----------------
(1 row)
-- 清理环境
drop PROCEDURE test_get_time1;
DROP PROCEDURE
-- 示例5
-- 给表名字符串做规范
declare
cname varchar2(50);
begin
dbe_utility.canonicalize('seg1', cname, 50);
dbe_output.put_line(cname);
end;
/
-- 预期结果为:
SEG1
ANONYMOUS BLOCK EXECUTE
-- 示例6
-- 将输入的字符串转换成一个表名的数组
DECLARE
tab_list VARCHAR2(100) := 't1,t2';
len BINARY_INTEGER;
tab varchar2[];
BEGIN
dbe_output.put_line('table list is: ' || tab_list);
dbe_utility.comma_to_table(tab_list, len, tab);
END;
/
-- 预期结果为:
table list is: t1,t2
ANONYMOUS BLOCK EXECUTE
-- 示例7
-- 查看数据库的版本号和兼容性版本号
declare
v_version varchar2;
begin
dbe_utility.db_version(v_version);
v_version:=left(v_version, 8);
dbe_output.print_line('version:' || v_version);
end;
/
-- 预期结果为:
version:gaussdb
ANONYMOUS BLOCK EXECUTE
-- 示例8
-- 查看当前CPU处理时间的测量值
DECLARE
cputime NUMBER;
BEGIN
cputime := dbe_utility.get_cpu_time();
dbe_output.put_line('cpu time:' || cputime);
END;
/
-- 预期结果为(数值并非固定):
cpu time:70179
ANONYMOUS BLOCK EXECUTE
-- 示例9
-- 获取数据库所在平台字节序的大小端信息
BEGIN
dbe_output.PUT_LINE(dbe_utility.GET_ENDIANNESS());
END;
/
-- 预期结果为:
2
ANONYMOUS BLOCK EXECUTE
-- 示例10
SET system_function_version TO DEFAULT;
SET
-- 获取一个给定字符串的hash值
DECLARE
result NUMBER(28);
BEGIN
result := dbe_utility.get_hash_value('hello',10,10);
dbe_output.put_line(result);
END;
/
-- 预期结果为:
15
ANONYMOUS BLOCK EXECUTE
-- 示例11
-- 判断当前数据库是否为集群模式
DECLARE
is_cluster BOOLEAN;
BEGIN
is_cluster := dbe_utility.IS_CLUSTER_DATABASE();
dbe_output.put_line('CLUSTER DATABASE: ' || CASE WHEN is_cluster THEN 'TRUE' ELSE 'FALSE' END);
END;
/
-- 预期结果为:
CLUSTER DATABASE: TRUE
ANONYMOUS BLOCK EXECUTE
-- 示例12
-- 获取当前用户环境下的数据库模式名称
DECLARE
schm varchar2(100);
BEGIN
schm := dbe_utility.old_current_schema();
dbe_output.put_line('current schema: ' || schm);
END;
/
-- 预期结果为(结果为当前数据库的模式名,并非固定):
current schema: public
ANONYMOUS BLOCK EXECUTE
-- 示例13
-- 获取当前用户名称
select dbe_utility.old_current_user() from sys_dummy;
-- 预期结果为(结果为当前数据库的用户名,并非固定):
old_current_user
------------------
test
(1 row)
-- 示例14
DECLARE
ddl_str VARCHAR2(255);
BEGIN
dbe_output.print_line('start to test exec_ddl_statement create table.');
ddl_str := 'CREATE TABLE test_ddl (COL1 INT)';
dbe_utility.exec_ddl_statement(ddl_str);
END;
/
-- 预期结果为:
start to test exec_ddl_statement create table.
NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'col1' as the distribution column by default.
HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
CONTEXT: SQL statement "CREATE TABLE test_ddl (COL1 INT)"
SQL statement "CALL dbe_utility.exec_ddl_statement(ddl_str)"
PL/pgSQL function inline_code_block line 5 at PERFORM
ANONYMOUS BLOCK EXECUTE
select * from test_ddl;
-- 预期结果为:
col1
------
(0 rows)
-- 清理环境
drop table test_ddl;
DROP TABLE
-- 示例15
create table t1 (c1 int primary key, c2 int);
insert into t1 values(1,1),(2,1),(3,2),(4,2),(5,3),(6,3);
create view v1 as select * from t1 where c1 > 1;
create view v2 as select c1 from v1 where c2 > 1;
create view v3 as select * from v2 where c1 > 2;
declare
in_sql clob := 'select * from public.v3';
out_sql clob;
begin
dbe_output.print_line('start to test expand_sql_text_proc v3 expend sql text.');
dbe_utility.expand_sql_text_proc(in_sql, out_sql);
dbe_output.print_line(out_sql);
end;
/
-- 预期结果为:
start to test expand_sql_text_proc v3 expend sql text.
SELECT c1 FROM (SELECT v2.c1 FROM (SELECT v1.c1 FROM (SELECT t1.c1, t1.c2 FROM public.t1 WHERE t1.c1 > 1) v1 WHERE v1.c2 > 1) v2 WHERE v2.c1 > 2) v3
ANONYMOUS BLOCK EXECUTE
-- 清理环境
drop table t1 cascade;
-- 预期结果为:
NOTICE: drop cascades to 3 other objects
DETAIL: drop cascades to view v1
drop cascades to view v2
drop cascades to view v3
-- 示例16
declare
name varchar2;
hash raw;
last4bytes bigint;
BEGIN
name := '';
-- return correctly (D41D8CD98F00B204E9800998ECF8427E, 2118318316)
dbe_utility.get_sql_hash(name,hash,last4bytes);
raise notice '%',hash;
raise notice '%',last4bytes;
END;
/
-- 预期结果为:
NOTICE: D41D8CD98F00B204E9800998ECF8427E
NOTICE: 2118318316
ANONYMOUS BLOCK EXECUTE
-- 示例17
declare
bitchar raw(8);
begin
bitchar := '2111111f';
dbe_output.print('test '|| bitchar ||' bit is_bit_set value from 1 to 32 bit: ');
for i in reverse 32 .. 1 loop
dbe_output.print(dbe_utility.is_bit_set(bitchar, i));
end loop;
dbe_output.print_line('.');
end;
/
-- 预期结果为:
test 2111111F bit is_bit_set value from 1 to 32 bit: 00100001000100010001000100011111.
ANONYMOUS BLOCK EXECUTE
-- 示例18
create or REPLACE PROCEDURE p_test_pk ( -- for print result
name in varchar2,
type in integer
)
as
schema varchar2;
part1 varchar2;
part2 varchar2;
dblink varchar2;
part1_type integer;
object_number integer;
begin
dbe_utility.name_resolve(name,type,schema,part1,part2,dblink,part1_type,object_number);
raise notice 'schema: % -- part1: % -- part2: % -- dblink: % -- part1_type: %', schema,part1,part2,dblink,part1_type;
end;
/
CREATE PROCEDURE
declare begin p_test_pk('a.b.c@aa',3); end;
/
-- 预期结果为:
NOTICE: schema: a -- part1: b -- part2: c -- dblink: aa -- part1_type: 0
CONTEXT: SQL statement "CALL p_test_pk('a.b.c@aa',3)"
PL/pgSQL function inline_code_block line 1 at PERFORM
ANONYMOUS BLOCK EXECUTE
-- 示例19
DECLARE
name varchar;
a varchar;
b varchar;
c varchar;
dblink varchar;
nextpos INTEGER;
BEGIN
name := '我.w#sdfsdf.CD';
DBE_UTILITY.NAME_TOKENIZE(name, a, b, c, dblink, nextpos);
RAISE INFO E'dbe_utility.name_tokenize parse error: name:%\na:%\nb:%\nc:%\ndblink:%',
name, a, b, c, dblink;
IF nextpos <> OCTET_LENGTH(name) THEN
RAISE INFO E'dbe_utility.name_tokenize length error: name:%\nlength of name:%\nnextpos:%',
name, OCTET_LENGTH(name), nextpos;
END IF;
END;
/
-- 预期结果为:
INFO: dbe_utility.name_tokenize parse error: name:我.w#sdfsdf.CD
a:我
b:W#SDFSDF
c:CD
dblink:<NULL>
ANONYMOUS BLOCK EXECUTE
-- 示例20
DECLARE
list varchar2(50) := 'aabb,ccdd,eeff,gghh';
len_list integer;
tab varchar2[];
get_list varchar2(50);
len_tab integer;
BEGIN
dbe_output.print_line('参数列表:' || list);
dbe_utility.comma_to_table(list,len_list,tab);
dbe_output.print_line('参数长度:' || len_list);
FOR i IN 1 .. len_list LOOP
dbe_output.print_line('列表名称 ' || i || ' : ' || tab(i));
END LOOP;
dbe_output.print_line('调用table_to_comma:');
dbe_utility.table_to_comma(tab,len_tab,get_list );
dbe_output.print_line('输出结果:' || get_list );
dbe_output.print_line('数组长度:' || len_tab);
END;
/
-- 预期结果为:
参数列表:aabb,ccdd,eeff,gghh
参数长度:4
列表名称 1 : aabb
列表名称 2 : ccdd
列表名称 3 : eeff
列表名称 4 : gghh
调用table_to_comma:
输出结果:aabb,ccdd,eeff,gghh
数组长度:4
ANONYMOUS BLOCK EXECUTE
-- 示例21
declare
name varchar2;
hash raw;
last4bytes bigint;
BEGIN
name := 'hello world';
-- return correctly(5EB63BBBE01EEED093CB22BB8F5ACDC3, 3285015183)
dbe_utility.get_sql_hash_func(name,hash,last4bytes);
raise notice '%',hash;
raise notice '%',last4bytes;
END;
/
-- 预期结果为:
NOTICE: 3285015183
NOTICE: <NULL>
ANONYMOUS BLOCK EXECUTE