2010-06-02 54 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