2016-05-30 211 views
-2

我是Oracle(10g)數據庫的新手。Oracle 10g觸發器

我的問題是,我不知道有關語法,我需要重寫該觸發器爲Oracle數據庫:

CREATE OR REPLACE TRIGGER trigger 
BEFORE INSERT OR UPDATE 
ON table 
FOR EACH ROW 
BEGIN 
    IF :NEW.date > SYSDATE THEN 
     RAISE_APPLICATION_ERROR(-20950, 'Error!'); 
    END IF; 
END; 
+0

爲什麼不運行它,看看它是否工作? – Mureinik

+0

你認爲我會在這裏寫代碼,如果代碼將工作? – KRiSTiN

+2

如果沒有,分享錯誤(如果有的話)或解釋錯誤(如果沒有錯誤)會幫助我們幫助你。 – Mureinik

回答

0

你提到你改變了觸發和表的名字,但是,我「會在這裏再次指出了那些(只是爲了完整性):

我看到3個錯誤:

  1. ‘觸發’保留字。在下面的例子中我改成了「ctrigger」。
  2. 「表」是保留字。我在下面的例子中改爲「垃圾」。
  3. 「日期」是保留字。我在下面的例子中改爲「cdate」。
  4. 我現在假設「cdate」是一個DATE數據類型。

下面的代碼正常運行..試着在你的系統上「按原樣」運行它並查看它是否有效?

如果確實如此,但它仍然在您的桌子上失敗,那麼我們肯定需要查看您桌子的定義以進一步排除故障。

drop table junk; 

    create table junk (id number, 
         cdate date); 

    CREATE OR REPLACE TRIGGER ttrigger 
    BEFORE INSERT OR UPDATE 
    ON junk 
    FOR EACH ROW 
    BEGIN 
     IF :NEW.cdate > SYSDATE THEN 
      RAISE_APPLICATION_ERROR(-20950, 'Error!'); 
     END IF; 
    END; 
/

測試結果如下:

SQL > create table junk (id number, 
         cdate date); 
    2 
    Table created. 

    Elapsed: 00:00:00.07 
    SQL > CREATE OR REPLACE TRIGGER ttrigger 
    BEFORE INSERT OR UPDATE 
    ON junk 
    FOR EACH ROW 
    BEGIN 
     IF :NEW.cdate > SYSDATE THEN 
      RAISE_APPLICATION_ERROR(-20950, 'Error!'); 
     END IF; 
    END; 
/

    Trigger created. 

    Elapsed: 00:00:00.20 
    SQL > show err 
    No errors. 
    SQL > 
+0

謝謝你的解決方案,但問題是表和屬性的名稱必須是在引號中。 – KRiSTiN

+0

這與什麼有關?您在表名稱周圍使用引號,因爲表名稱包含混合大小寫。這與觸發器代碼無關,我寫了什麼,或者它是如何工作的......請發佈你的表格定義.. – Ditto