Sql Trigger麻烦

时间:2010-06-02 12:19:36

标签: sql oracle triggers

嘿伙计们,我不能让这个触发器工作,我已经工作了一个小时左右,并且无法找出我哪里出错,任何帮助将不胜感激

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时

  

第6行的错误:ORA-04079:无效   触发规范

4 个答案:

答案 0 :(得分:8)

CREATE OR REPLACE TRIGGER allergy BEFORE INSERT ON   

此处的表名称

FOR EACH ROW -- forgot this too

DECLARE 
    med VARCHAR2(20);

您应该将此声明为%type。

    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或任何编程背景。我想你开始使用一些示例代码并尝试将其修改为某种东西。但你真的留下了胡言乱语。我开始认为这是作业。

答案 1 :(得分:2)

除了Mark指出你缺少表名,而Martin指出你希望这是一个行级触发器,你的实际主体将无法编译,原因有两个。

  • 您看起来似乎在尝试选择两列,但它们之间没有逗号,并且INTO子句中只有一个局部变量
  • 您使用未在任何地方声明的标识符allergies

我也怀疑你的查询在逻辑上是否正确,但我当然不知道数据库设计所以我不能肯定地说。

答案 2 :(得分:1)

BEFORE INSERT ON <TABLE NAME>

为什么当你只选择一个变量时选择v.medication和RCD.specify?

答案 3 :(得分:0)

你可能已经看过了这个,但是: http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

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