简体   繁体   中英

oracle trigger on update and on insert

I have a table defined in MySQL as following. Now I want to create this table in oracle.

But how can I convert on update trigger in to oracle?

create table test(
    userid  INTEGER(10) NOT NULL AUTO_INCREMENT,
    CONSTRAINT PRIMARY KEY  (userid),
    fullname VARCHAR(200) NOT NULL,
    email VARCHAR(50) NOT NULL,
    createdat DATETIME NOT NULL DEFAULT NOW(),
    updatedat DATETIME ON UPDATE NOW()
);

For a example, so:

CREATE TABLE test
(
      userid    INTEGER PRIMARY KEY
    , fullname  VARCHAR2(200) NOT NULL
    , email     VARCHAR2(50) NOT NULL
    , createdat DATE DEFAULT CURRENT_DATE NOT NULL
    , updatedat DATE
);

CREATE SEQUENCE test_seq START WITH 1 INCREMENT BY 1;

CREATE OR REPLACE TRIGGER test_insert
  BEFORE INSERT
  ON test
  FOR EACH ROW
BEGIN
  SELECT test_seq.NEXTVAL
   INTO :new.userid
    FROM DUAL;
END;

CREATE OR REPLACE TRIGGER test_update
  BEFORE UPDATE
  ON test
  FOR EACH ROW
BEGIN
  SELECT CURRENT_DATE
    INTO :new.updatedat
    FROM DUAL;
END;

Triggers may BEFORE UPDATE , AFTER UPDATE , and INSTEAD . Choose that you want. For more information read docs http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7004.htm

Since Oracle 12c, you can avoid using SEQUENCE in using IDENTITY as done in standard SQL.

The solution to your problem is following

CREATE TABLE test
    ( userid    INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY 
    , fullname  VARCHAR2(200) NOT NULL
    , email     VARCHAR2(50) NOT NULL
    , createdat DATE DEFAULT CURRENT_DATE NOT NULL
    , updatedat DATE
    );

CREATE OR REPLACE TRIGGER test_update
  BEFORE UPDATE
  ON test
  FOR EACH ROW
BEGIN
  SELECT CURRENT_DATE
    INTO :new.updatedat
    FROM DUAL;
END;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM