【发布时间】:2018-04-21 08:18:39
【问题描述】:
我正在学习专门的 PL/SQL 触发器,我想学习如何使用触发器对多个表进行操作,但我无法理解该过程。这是一个例子:
CREATE TABLE Sess
(code INTEGER NOT NULL,
dateStart DATE NOT NULL,
dateEnd DATE NOT NULL,
CONSTRAINT KeySess PRIMARY KEY(code)
)
CREATE TABLE Ins
(codeIns CHAR(12) NOT NULL,
code INTEGER NOT NULL,
dateIns DATE NOT NULL,
dateAb DATE,
note INTEGER,
CONSTRAINT KeyIns PRIMARY KEY (codeIns, code)
)
1/ 我正在尝试构建一个触发器来确保这一点:
before Insert or Update Ins
dateAb is between dateStart and dateEnd
2/ 我还想ALTER TABLE 并锁定代码,以及 Ins 中的 codeIns,因此没有人可以更新它们,但我不知道命令。
对于第一个触发器,我尝试了类似的方法:
CREATE OR REPLACE TRIGGER test
BEFORE INSERT OR UPDATE OF dateAb ON Ins
FOR EACH ROW
DECLARE
start date;
BEGIN
SELECT DISTINCT s.dateStart INTO start
WHERE Ins.code = s.code
IF (:NEW.dateAb < start) THEN
raise_application_error(-20101,'dateAb incorrect');
END IF;
END;
注意:我没有声明变量 end 来检查它是否介于两者之间,我的目的是测试正确的语法
注意2:表格是空的。
我有 Warning: Trigger created with compilation errors. 和 3 个错误:
PL/SQL: SQL Statement ignored
4/40 PL/SQL: ORA-00923: key-word FROM absent
9/5 PLS-00103: Encountered the symbol "IF" when expecting one of the
following:
;
最后就像我说的那样,我不知道锁定表上的列以防止更新或是否有可能的正确语法。
我正在学习,所以如果你们中的一个人能教我正确处理我的两个请求的方法,我将不胜感激。 谢谢
【问题讨论】:
-
您的
select丢失了from sess s。where子句应该是where s.code = :new.code。 -
另外,
start是 SQL 关键字(connect by语法的一部分),因此您不能将其用作变量。