【发布时间】:2014-05-08 04:03:21
【问题描述】:
我的代码不起作用,Oracle 告诉我触发器创建时存在构建错误。显然我无法获得有关构建错误是什么的更准确信息...
我之前真的没有做过很多 SQL,所以我对语法不是很熟悉。我有一种预感,Oracle 不喜欢我的 IF EXISTS (SELECT ...) THEN 语句,我一直在谷歌搜索类似的例子,但我真的找不到任何适合我的情况。
关于代码:
- “debut”是一个日期属性(表示开始)
- “fin”是另一个日期属性(表示结束)
- 如果这两行具有相同的“numInfirmier”属性,我想确保新行的日期不与表中的任何其他行重叠。
- 所以我选择所有与新行具有相同 numInfirmier 且日期重叠的行。
-
如果该选择中存在任何内容,我会提出错误。
CREATE OR REPLACE TRIGGER chev_surv BEFORE INSERT OR UPDATE ON surveillance FOR EACH ROW BEGIN IF EXISTS ( SELECT * FROM surveillance WHERE surveillance.numInfirmier = :NEW.numInfirmier AND ((surveillance.debut > :NEW.debut AND surveillance.debut < :NEW.fin) OR (surveillance.fin > :NEW.debut AND surveillance.fin < :NEW.fin)) ) THEN RAISE_APPLICATION_ERROR(-20001, 'Il ne doit pas y avoir de chevauchement entre deux périodes surveillance pour un surveillant.'); END IF; END; /
知道有什么问题吗?
【问题讨论】:
-
如果您的客户支持,您可以通过
show errors或select * from user_errors where type = 'TRIGGER' and name = 'CHEV_SURV'获得有关实际错误的更准确信息。这适用于任何存储的 PL/SQL。你是对的,你不能在select条件之外使用exists。但即使你让它编译,你也会得到一个变异表错误——你不能查询触发器所针对的表。 -
天哪,知道这是件好事XD
-
"show error" 说我只能在 SQL 指令中使用 "EXISTS".... wut?
-
您正试图在 PL/SQL 上下文中使用它;它是一种不同的(尽管经常是重叠的)语言。你可以only use it in a subquery,点赞
select ... from ... where exists (select ... from ...)。贾斯汀的回答向您展示了在这种情况下您应该如何检查,以及为什么它仍然无法工作 *8-)
标签: sql oracle select triggers exists