【问题标题】:Oracle converting a function to a triggerOracle将函数转换为触发器
【发布时间】:2021-12-01 00:14:59
【问题描述】:

我有以下功能,我想将其转换为 INSERT/UPDATE 列 hash_pk 的触发器。我在尝试将其转换为触发器时遇到语法错误。谁能帮帮我。

其次,将列 hash_pk 存储为 RAW(如果是,有多大)而不是 VARCHAR2 会更有效吗?

提前感谢所有回答。


CREATE or REPLACE FUNCTION HASH_SHA512 (
    psINPUT IN VARCHAR2
    ) RETURN VARCHAR2 AS
    rHash RAW (512);
    BEGIN
    rHash := DBMS_CRYPTO.HASH (TO_CLOB (psINPUT), 
dbms_crypto.HASH_SH512);
    RETURN ((RAWTOHEX (rHash)));
    END HASH_SHA512;
/  

CREATE table t(
seq_num integer  GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
hash_pk VARCHAR2(1000) not NULL PRIMARY KEY, 
c CLOB,
create_date DATE DEFAULT SYSDATE
);
/

create or replace
    trigger hash_trg
    before insert  or update on  t
   for each row
    begin
    :new.hash_pk := HASH_SHA512(:new.c);
    end;
  

 insert into t (c) values (
      rpad('z',16,'z')
  );

SELECT * from t

SEQ_NUM    HASH_PK    C    CREATE_DATE
1    2C9437F9D8FB13FC959CA2B9D5B81958B5A32556C60E35D66D1DA92227593A14316FD32EE2B3EEE06EECB1484A0CACAE61A4F930E772BB78AC84E75948DAA628    zzzzzzzzzzzzzzzz    12-OCT-21


update t set c='Good Bye';

SELECT * from t;

SEQ_NUM    HASH_PK    C    CREATE_DATE
1    DCBC14FA2F46F1E264BBD52C4A3DF87E32CC511B43FD9AD722EACCFCA6D8CBE398D10E61E83A85625C7CF96E70348F2D33595196577B01C488030E560A7D34F7    Good Bye    12-OCT-21

【问题讨论】:

  • 您在编译触发器时遇到什么错误?
  • @Ali Fidanli 感谢您的回复。我得到并回答了我自己的

标签: oracle function hash raw


【解决方案1】:

我知道它缺少括号


create or replace
    trigger hash_trg
    before insert  or update on  t
   for each row
    begin
    :new.hash_pk := DBMS_CRYPTO.HASH  ((:new.c), 
dbms_crypto.HASH_SH512);
    end;
  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 2013-07-16
    • 1970-01-01
    • 2011-09-11
    • 2019-04-08
    • 2016-11-16
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多