暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 具有大于4000个字符的大字符串的MD5函数

askTom 2018-03-07
516

问题描述

我正在为表中的级联列寻找MD5值的函数。我计划在insert/update trigger之前使用此函数将此值存储为同一表中的列 (md5_hash) 之一。目的是将此列用于更改数据捕获,以将更改加载到数据仓库系统。以下是触发因素。

创建或替换触发器biu_trigger
在插入或更新表之前为每行
开始
: 新的。etl_load_date:= sysdate;
: new.Md5 _ 哈希: = 生成 _ md5(:NEW.concernid ||: NEW.COLUMN1 ||: NEW.COLUMN2 | | TO_CHAR(:NEW.creationdate,'yyyymmddhh24miss ';
结束biu_trigger
;
/

基于google搜索,找到以下代码获取MD5哈希。

创建或替换函数HASH_MD5 (
变量2中的psINPUT
) 将VARCHAR2返回为
rHash RAW (16);
开始
rHash := DBMS_CRYPTO.HASH (TO_CLOB (psINPUT),DBMS_CRYPTO.HASH_MD5);
返回 (较低 (RAWTOHEX (rHash);
结束哈希 _ md5;

这似乎可以很好地输入值多达4000个字符。但似乎不工作,如果连接列有更多的数据4,000,000字符。

因此,如果您可以建议如何为超过4000个字符长的字符串获取MD5,我将不胜感激。

我正在使用11.2。

谢谢。

专家解答

我需要看一个完整的例子-因为它对我来说很好

SQL> create table t (
  2    c1 varchar2(4000),
  3    c2 varchar2(4000),
  4    hash varchar2(4000)
  5    );

Table created.

SQL>
SQL> CREATE or REPLACE FUNCTION HASH_MD5 (
  2  psINPUT IN VARCHAR2
  3  ) RETURN VARCHAR2 AS
  4  rHash RAW (16);
  5  BEGIN
  6  rHash := DBMS_CRYPTO.HASH (TO_CLOB (psINPUT), DBMS_CRYPTO.HASH_MD5);
  7  RETURN (LOWER (RAWTOHEX (rHash)));
  8  END HASH_MD5;
  9  /

Function created.

SQL>
SQL> create or replace
  2  trigger trg
  3  before insert on  t
  4  for each row
  5  begin
  6  :new.hash := HASH_MD5(:new.c1||:new.c2);
  7  end;
  8  /

Trigger created.

SQL>
SQL> insert into t (c1,c2) values (
  2    rpad('x',4000,'x'),
  3    rpad('x',4000,'x')
  4  );

1 row created.

SQL>
SQL> select hash from t;

HASH
--------------------------------------------------------------------------
d49d36f757d863f1f12fedf91a893e19

复制


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论