簡體   English   中英

從另一個表中查找觸發

[英]Trigger with lookup from another table

我正在學習專門針對PL / SQL的觸發器,並且我想學習如何使用觸發器在多個表上進行操作,但是在理解過程時遇到了麻煩。 這是一個例子:

CREATE TABLE Sess
(code       INTEGER     NOT NULL,
 dateStart  DATE        NOT NULL,
 dateEnd    DATE        NOT NULL,
 CONSTRAINT KeySess PRIMARY KEY(code)
)

CREATE TABLE Ins
(codeIns    CHAR(12)    NOT NULL,
 code       INTEGER     NOT NULL,
 dateIns    DATE        NOT NULL,
 dateAb     DATE,
 note       INTEGER,
 CONSTRAINT KeyIns PRIMARY KEY (codeIns, code)
)

1 /我正在嘗試建立一個可以確保這一點的觸發器:

before Insert or Update Ins

dateAb is between dateStart and dateEnd

2 /我也想ALTER TABLE並鎖定Ins中的代碼和codeIns,因此沒有人可以更新它們,但我不知道該命令。

對於第一個觸發器,我嘗試了類似的方法:

CREATE OR REPLACE TRIGGER test
BEFORE INSERT OR UPDATE OF dateAb ON Ins
FOR EACH ROW
DECLARE
    start date;
BEGIN
    SELECT DISTINCT s.dateStart INTO start
    WHERE Ins.code = s.code
    IF (:NEW.dateAb < start) THEN
        raise_application_error(-20101,'dateAb incorrect');
    END IF;
END;

注意:我沒有聲明變量end來檢查它是否在中間,我的目的是測試正確的語法

注2:表為空。

我有Warning: Trigger created with compilation errors. 和3個錯誤:

PL/SQL: SQL Statement ignored
4/40    PL/SQL: ORA-00923: key-word FROM absent 
9/5     PLS-00103: Encountered the symbol "IF" when expecting one of the
        following:
        ;

最后,就像我說的那樣,我不知道正確的語法來鎖定表上的列以防止更新或可能的話。

我正在學習,所以如果你們中的一個可以教我正確地處理我的兩個請求的方法,我將不勝感激。 謝謝

嘗試這個:

create or replace trigger test
    before insert or update of dateab on ins
    for each row
declare
    l_sess_start date;
begin
    select s.datestart into l_sess_start
    from   sess s
    where  s.code = :new.code;

    if :new.dateab < l_sess_start then
        raise_application_error
        ( -20101
        , 'Start date ' || to_char(:new.dateab,'DD-MON-YYYY') ||
          ' cannot be before ' || to_char(l_sess_start,'DD-MON-YYYY'));
    end if;
end;

測試:

insert into sess values (1, date '2018-04-22', date '2018-04-30');

insert into ins values ('Z', 1, date '2018-04-01', date '2018-04-01', null);

ERROR at line 1:
ORA-20101: Start date 01-APR-2018 cannot be before 22-APR-2018
ORA-06512: at "WILLIAM.TEST", line 10
ORA-04088: error during execution of trigger 'WILLIAM.TEST'
PLS-00103: Encountered the symbol "IF" when expecting one of the
           following:
           ;

此錯誤是因為您不見了; 選擇語句后

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM