【问题标题】:How to get results from Oracle Trigger and act accordingly如何从 Oracle 触发器中获取结果并采取相应措施
【发布时间】:2013-12-03 18:10:54
【问题描述】:

我为我的数据库中的一个表创建了一个更新后触发器,当一个特定列中的值被修改时,它也会从另一个数据库更新同一个表。我的问题是,我如何检查结果是否为 0(这意味着该行在第二个数据库中不存在,而 1 表示该行存在且已更新)并采取相应措施?我想如果我得到 0 这意味着这样的主键不存在,在第二个数据库中创建它。这是我的 ORACLE 触发代码:

 CREATE OR REPLACE TRIGGER UPDATE_BIOGR 
AFTER UPDATE OF ID_PATIENTS,NAME,SNAME,GENDER,DATE_BORN,COUNTRY,CITY,BLOODTYPE,FATHER_ID,MOTHER_ID,FATHER_NAME,FATHER_LASTNAME,MOTHER_FIRSTNAME,MOTHER_LASTNAME,TIL,E_MAIL ON BIOGR 
 REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW

   DECLARE
   v_username varchar2(10);

BEGIN
   SELECT user INTO v_username
   FROM dual;

    UPDATE PERSONAL_RECORD.BIOGR SET
    ID = :NEW.ID_PATIENTS, NAME = :NEW.NAME, SNAME = :NEW.SNAME, GENDER = :NEW.GENDER, DATEBORN = :NEW.DATE_BORN, PLACE_BORN = :NEW.COUNTRY, 
    PLACE_STATE = :NEW.CITY, BLOOD_TYPE = :NEW.BLOODTYPE, ID_FATHER = :NEW.FATHER_ID, ID_MOTHER = :NEW.MOTHER_ID, 
    FATHER_NAME = :NEW.FATHER_NAME, FATHER_SNAME = :NEW.FATHER_LASTNAME, MOTHER_NAME = :NEW.MOTHER_FIRSTNAME, 
    MOTHER_SNAME = :NEW.MOTHER_LASTNAME, TIL = :NEW.TIL, EMAIL = :NEW.E_MAIL, UPDATED_FROM = v_username
    WHERE PERSONAL_RECORD.BIOGR.ID = :NEW.ID_PATIENTS;
END;

【问题讨论】:

  • 试试MERGE 语句,这样您可以更新现有列或插入新列。

标签: sql oracle triggers


【解决方案1】:

尝试MERGE-Statement,如下所示:

MERGE INTO personal_record.biogr USING dual ON
(PERSONAL_RECORD.BIOGR.ID = :OLD.ID_PATIENTS)
WHEN MATCHED THEN    
UPDATE SET
ID = :NEW.ID_PATIENTS, NAME = :NEW.NAME, SNAME = :NEW.SNAME, GENDER = :NEW.GENDER, DATEBORN = :NEW.DATE_BORN, PLACE_BORN = :NEW.COUNTRY, 
PLACE_STATE = :NEW.CITY, BLOOD_TYPE = :NEW.BLOODTYPE, ID_FATHER = :NEW.FATHER_ID, ID_MOTHER = :NEW.MOTHER_ID, 
FATHER_NAME = :NEW.FATHER_NAME, FATHER_SNAME = :NEW.FATHER_LASTNAME, MOTHER_NAME = :NEW.MOTHER_FIRSTNAME, 
MOTHER_SNAME = :NEW.MOTHER_LASTNAME, TIL = :NEW.TIL, EMAIL = :NEW.E_MAIL, UPDATED_FROM = v_username
WHEN NOT MATCHED THEN
INSERT (id, name, sname, ....)
VALUES (:NEW.ID_PATIENTS, :NEW.NAME, :NEW.SNAME, ...);

【讨论】:

  • 我最终做了一个 count(*) 并声明了一个计数器变量,然后做一个 if 语句来查看它是 0 还是 1。什么更好?合并还是我的解决方案?
  • 顺便说一句,您的语句缺少 ON 关键字,但对我来说看起来不错
  • 它在哪里错过了部分? 1-2 行有一个。不知道还有更多需要。
  • 它说在它合并的行缺少一个 ON 关键字......“使用双重”是什么?双表只是为了获取当前的数据库用户。
  • 可能需要一些括号。不确定,没有架构就无法测试它。对不起。作为提示,有什么可能的解决方案
猜你喜欢
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多