2010-06-02 88 views
1

嗨,我不能讓這個觸發器工作,香港專業教育學院在其上工作了一個小時左右,無法看到揣摩出我去錯了,任何幫助,將不勝感激SQL觸發器麻煩

CREATE OR REPLACE TRIGGER allergy 

BEFORE INSERT ON 

DECLARE 
med VARCHAR2(20); 

BEGIN 

SELECT v.medication RCD.specify 
INTO med 
FROM visit v, relcondetails RCD 
WHERE :new.medication = v.medication AND RCD.specifiy = 'allergies'; 

IF med = allergies THEN 
    RAISE_APPLICATION_ERROR(-20000, 'Patient Is alergic to this medication'); 
END IF; 
END allergy; 

當放到Oracle

ERROR在第6行:ORA-04079:無效 觸發說明書

回答

1
BEFORE INSERT ON <TABLE NAME> 

以及爲什麼選擇v.medication和RCD.specify當你只選擇一個變量?

+0

多數民衆贊成我本來有,但我一直得到 ORA-04082:新的或舊的引用在表級別不允許觸發 所以我wanst不太清楚,如果它是正確的。 – SImon 2010-06-02 12:30:13

+1

你需要通過添加'FOR EACH ROW'來創建它作爲行觸發器 – 2010-06-02 12:33:21

+0

@Martin Well spotted – 2010-06-02 12:36:46

0

你可能已經看到了這一點,但是: http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

CREATE TRIGGER TriggerName 
ON MyTableName 
FOR MyEvent 
AS 
    -- My Trigger Logic 
+0

他在Oracle上! – 2010-06-02 12:27:29

+0

正確的馬丁,邏輯依然幫助但是謝謝felipe! – SImon 2010-06-02 12:29:21

+0

@SImon儘管其餘的語法有很大不同。例如SQL Server沒有像Oracle那樣的行和語句觸發器。 – 2010-06-02 12:32:30

2

除了馬克的一點,你缺少的表的名稱,你想這是一個行級觸發器馬丁的時候,你的實際的身體不會編譯,有幾個原因。

  • 你看起來像你想選擇兩列,但你沒有他們之間的一個逗號,你只能有一個局部變量INTO子句
  • 您使用的標識符allergies這是在沒有任何地方宣佈

我也懷疑你的查詢在邏輯上是正確的,但我當然不知道數據庫設計,所以我不能肯定地說。

+0

我的所有觸發器都有DECLARE – 2010-06-02 19:55:02

+0

他只需要一個'DECLARE',因爲他聲明瞭一個局部變量。 – 2010-06-03 02:38:42

+0

我對DECLARE的一點抱歉 - 我在想觸發器會使用與過程或函數相同的語法。刪除它。 – 2010-06-03 12:24:08

8
CREATE OR REPLACE TRIGGER allergy BEFORE INSERT ON 

表的名字在這裏

FOR EACH ROW -- forgot this too 

DECLARE 
    med VARCHAR2(20); 

你真的應該被宣佈本作類型%。

med visit.medication%type; 

BEGIN 

SELECT v.medication RCD.specify 

需要列之間用逗號

INTO med 

兩列需要兩個變量

FROM visit v, relcondetails RCD 
    WHERE :new.medication = v.medication AND RCD.specifiy = 'allergies'; 

您沒有加入你的兩個表之間的狀態,這是非常糟糕的。該查詢將在兩個表格之間執行笛卡爾,然後將它們的所有列表中的「過敏」和new.medication返回到它們各自的列中。

您也可能需要過濾條件來限制對特定患者或特定訪問的查詢。該查詢將針對所有患者以及他們的所有訪問進行平方。

IF med = allergies THEN 

我不知道什麼/過敏/是在這個IF。沒有定義爲變量的變量,如果沒有引號,它不是字符串。

RAISE_APPLICATION_ERROR(-20000, 'Patient Is alergic to this medication'); 

此錯誤消息強化了我對您的查詢所說的內容。你認爲你在爲單個病人查詢,但你沒有。

END IF; 
END allergy; 

嚴重的是,如果你正在寫的軟件,從獲得潛在威脅生命的藥物救一個人,那麼請考慮工作的一些其他線路。我發誓我並不是說這是粗魯的,但是你的代碼示例幾乎不瞭解pl/sql語言,sql或任何編程背景。我認爲你從一些示例代碼開始,並試圖將其修改成某種東西。但你真的留下了胡言亂語。我開始認爲這是作業。

+4

我希望它的功課:) – 2010-06-03 02:36:53

+0

太搞笑了,最近downvote沒有解釋。 – 2011-02-07 16:06:30