嘿伙计们,我不能让这个触发器工作,我已经工作了一个小时左右,并且无法找出我哪里出错,任何帮助将不胜感激
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:无效 触发规范
答案 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指出你希望这是一个行级触发器,你的实际主体将无法编译,原因有两个。
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