使用觸發器通知自己有關更改的行是沒有意義的。如果你在表格中插入新的行,那麼你有關於它們的所有信息。爲什麼不喜歡的東西以下的塊,而不是一個觸發器:
create table reviews as select 0 as rid, 0 as userid, 0 as score, 0 as pid from dual where 1=0;
create table users as select 101 as userid, cast('nobody' as varchar2(100)) as uname from dual;
create table products as select 1001 as pid, cast('prod 1001' as varchar2(100)) as pname from dual;
<<my>>declare newreview reviews%rowtype; uname users.uname%type; pname products.pname%type; begin
insert into reviews values(1,101,10,1001) returning rid,userid,score,pid into newreview;
select uname, pname into my.uname, my.pname
from users u natural join products p
where u.userid = newreview.userid and p.pid = newreview.pid
;
dbms_output.put_line('user: '||my.uname||' entered a new review for Product: '||my.pname||' with a review score of: '||newreview.score);
end;
/
輸出:user: nobody entered a new review for Product: prod 1001 with a review score of: 10
爲了告知你應該使用DBMS_ALERT事件(交易)或DBMS_PIPE(非交易)封裝另一個會話。 dbms_alert的一個例子:
create or replace trigger new_review_trig after insert on reviews for each row
begin
dbms_alert.signal('new_review_alert', 'signal on last rid='||:new.rid);
end;
/
在另一個會話(新窗口,工作表,sqlplus或其他)中運行以下塊。它會被阻止,直到登記的信號到達:
<<observer>>declare message varchar2(400); status integer; uname users.uname%type; pname products.pname%type; score reviews.score%type;
begin
dbms_alert.register('new_review_alert');
dbms_alert.waitone('new_review_alert', observer.message, observer.status);
if status != 0 then raise_application_error(-20001, 'observer: wait on new_review_alert error'); end if;
select uname, pname, score into observer.uname, observer.pname, observer.score
from reviews join users using(userid) join products using (pid)
where rid = regexp_substr(observer.message, '\w+\s?rid=(\d+)', 1,1,null,1)
;
dbms_output.put_line('observer: new_review_alert for user='||observer.uname||',product='||observer.pname||': score='||observer.score);
end;
/
現在,在您的會話:
insert into reviews values(2, 101,7,1001);
commit; --no alerting before commit
的另一個(觀察員)會議將與輸出完成:
observer: new_review_alert for user=nobody,product=prod 1001: score=7
使用dbms_output意味着只有執行插入的用戶纔會看到該消息 - 然後僅當他們啓用了輸出時 - 這有點沒有意義。它只對調試非常有用/安全。你也總是會得到一個或多個行,所以不知道查詢的要點是什麼;當你查詢觸發器所反對的表時,你可能會遇到一個變異表錯誤 - 儘管這看起來並不是必須的。 –