比如: emp表,
當新增一條資料的時候,進行與表中ename欄位進行判斷, 如果新增的資料ename在表中已經存在,則除主鍵外其他欄位均與原資料相同,并插入.若沒有相同的ename欄位值,不做處理,直接插入
例如: 要創建一條empno為9988, ename為SMITH的資料,其他欄位不寫,取默認,經過觸發器后,新增的資料為 [empno:9988, ename:SMITH, job:CLERK, mgr:7902, hiredate:17-DEC-80, sal: 800, comm: (null), deptno:20](僅僅empno不同,其余欄位相同)
不知該如何寫這樣一個觸發器,求大神給解答一下,如果有執行陳述句就最好不過了
uj5u.com熱心網友回復:
大家有沒有寫過類似的觸發器,能否借鑒一下觸發器陳述句? 十分感謝uj5u.com熱心網友回復:
樓主這個需求,不妨考慮把 insert 換成 merge 陳述句,非常適合你現在的需求。merge into 的語法, 先百度一下,有問題再來追問。
uj5u.com熱心網友回復:
非常感謝2樓解答,我先去搜索下merge的用法uj5u.com熱心網友回復:
create or replace trigger tri_insert_empyee
after
insert
on emp
for each row
declare
begin
--當插入的時候執行
if insert then
merge into emp e
using (
--搜索新插入資料(其中部分欄位為空,以此篩選)
select * from emp where sal = null
) ee
on (
--已兩張表中empno相同,且工資e表中工資不為空作為條件
e.ename = ee.ename and
e.sal != null
)
when matched then
--當匹配時,對新增資料中的欄位進行賦值
update set (ee.sal = e.sal)
when not matched then
--不匹配情況下,則直接插入,未填寫欄位取空值(此處不確定,因為觸發器時在執行插入之后觸發,那么下面的插入操作是否就導致資料重復執行了?)
insert (e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno) values (ee.empno, ee.ename, ee.job, ee.mgr, ee.hiredate, ee.sal, ee.comm, ee.deptno);
end if;
end;
報錯:LINE/COL ERROR
--------- -------------------------------------------------------------
3/8 PLS-00103: 出現符號 "INSERT"在需要下列之一時: ( - + case mod new not null <an identifier> <a double-quoted delimited-identifier> <a bind variable> continue avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval date <a string literal with character set specification> <a number> <a single-quoted SQL string> pipe <一個帶有字符集說明的可帶引號的字串文字> <一個可帶引號的 SQL 字串> purge
錯誤: 查看編譯器日志
uj5u.com熱心網友回復:
前輩,請問4樓這樣寫,哪里出問題了,orcale報錯實在有些看不懂,另外我這樣寫的思路是對的嗎?
uj5u.com熱心網友回復:
不是 merge 寫到觸發器中,而是用 merge 替換掉原來的 insert 陳述句,也就用不到觸發器了。uj5u.com熱心網友回復:
實際是別人的資料通過insert匯入到我的表中來,我無法控制,原本是要做個觸發器,在對新匯入過來的資料進行部分欄位判斷,我的表中如果存在相同的記錄的時候,就把新匯入的記錄中的其他部分欄位進行更新替換,看來merge對我的這個功能不太合適了.
uj5u.com熱心網友回復:
嗯,看來不適用于這個 merge 語法。你這個只能考慮組合觸發器了。大概思路如下:
1、在 before row 記錄一下所有新插入的資料。
2、在 after stmt 中處理所有重復資料、
uj5u.com熱心網友回復:
直接BEFOR INSERT觸發器就可以了吧先select * from table into 變數 where empname = :new.empname;
然后:new.*** := 變數A;
:new.*** := 變數B;
以此類推即可
uj5u.com熱心網友回復:
最好empname這個欄位做個索引,不然表的資料量大的話,這個trigger效率低的嚇人轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/57051.html
標籤:開發
