环境:11g
准备知识:
用到了sys.dbms_obfuscation_toolkit.md5
看源码定义:
SUBTYPE varchar2_checksum IS VARCHAR2(16);
SUBTYPE raw_checksum IS RAW(16);
PROCEDURE MD5(input IN RAW,
checksum OUT raw_checksum);
FUNCTION MD5(input IN RAW)
RETURN raw_checksum;
PROCEDURE MD5(input_string IN VARCHAR2,
checksum_string OUT varchar2_checksum);
FUNCTION MD5(input_string IN VARCHAR2)
RETURN varchar2_checksum;
这里subtype是什么?
--SUBTYPE 主要是定义一个变量类型,方便批量修改
--也可以自定义范围
DECLARE
-- 定义一个 rate 数据类型,它的父类型是 NUMBER
-- rate 是 NUMBER(6, 4) 的另一个名字,和 NUMBER(6, 4) 没有任何区别
SUBTYPE type1 IS NUMBER(6, 4);
-- 定义一个 test 数据类型,不允许 NULL 值
SUBTYPE type2 IS NUMBER(3, 1) NOT NULL;
v_1 type2:=13;
-- 定义一个 test2 数据类型,它的值得范围是 -100 到 100
SUBTYPE type3 IS PLS_INTEGER RANGE -100..100;
v_2 type3;
BEGIN
v_2:=101;
null;
END;
/
开始调用:
方式1:直接调用
drop table md5_tab;
create table md5_tab(md5 varchar2(32),name varchar2(10));
--直接调用
select utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5(input_string => 'ysy')) from dual;
--直接插入
insert into md5_tab(md5) values(utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5(input_string => 'ysy')));
--直接更新
update md5_tab aa set aa.md5=utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5(input_string => md5));
方式2:函数调用
1.外面创建函数
create or replace function md5(input varchar2)
return varchar2 as
begin
return lower(utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5(input_string => input)));
end;
-- 可直接作用于sql上面.没问题
begin
update md5_tab aa set aa.md5=md5('ysy');
end;
2.如果只是临时使用怎么处理
-- md5默认32位
declare
v_md varchar2(32);
function md5(input varchar2)
return varchar2 as
begin
return utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5(input_string => input));
end;
begin
--pragma inline(f, 'YES');
--需要用一个临时变量接受局部函数的值,因为局部函数无法直接使用在sql上面
v_md:=md5('ysy');
update md5_tab aa set aa.md5=v_md;
end;
--如果要批量更新呢,用一个变量接受就不太合适了
--因为局部函数无法直接使用在sql上面
--所以只能使用在外面定义的函数
declare
begin
--报错 PLS-00231: 函数 'MD5' 不能在 SQL 中使用
--select md5('ysy') into v_md from dual;
--这里可结合for循环使用
update md5_tab aa set aa.md5=utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5(input_string => md5)),
aa.name='aa';
end;