第一个请求是确保在城市中我们只有一个分支机构, Banch(idBranch(PK),城市)进行更新和插入
我的想法是创建一个包含第一个数据的临时表,这样我就可以避免ora错误,这是我编写的代码,我遇到错误PL / SQL:ORA-00903和我我不确定在这种情况下是否可以触发一个触发器,因为它应该可以插入和更新。我需要您的建议,谢谢。
` CREATE TABLE TEMP_BRANCH AS SELECT NumBranch, CITY FROM BRANCH;
CREATE OR REPLACE TRIGGER checkUniqueBranchPerCity
BEFORE INSERT OR UPDATE ON BRANCH
REFERENCING
NEW AS nextLine
FOR EACH ROW
BEGIN
LOCK TABLE TEMP_BRANCH IN ROW SHARE MODE;
FOR line IN (SELECT * FROM TEMP_BRANCH) LOOP
IF :nextLine.City = line.City THEN
RAISE_APPLICATION_ERROR;
END IF;
END LOOP;
DELETE * FROM TEMP_BRANCH;
END;
/ `
答案 0 :(得分:0)
ORA-00903是“无效的表名”。我怀疑是由于您在nextLine
前面放了一个冒号,即您写了
IF :nextLine.City = line.City THEN
应该在什么时候
IF nextLine.City = line.City THEN
但是我建议摆脱REFERENCING子句,而在触发器中只使用:NEW和:OLD,因为它可以减少混乱。所以用
CREATE TABLE TEMP_BRANCH AS SELECT NumBranch, CITY FROM BRANCH;
CREATE OR REPLACE TRIGGER checkUniqueBranchPerCity
BEFORE INSERT OR UPDATE ON BRANCH
FOR EACH ROW
BEGIN
LOCK TABLE TEMP_BRANCH IN ROW SHARE MODE;
FOR line IN (SELECT * FROM TEMP_BRANCH) LOOP
IF :NEW.City = line.City THEN
RAISE_APPLICATION_ERROR;
END IF;
END LOOP;
END;
/
我还建议您摆脱触发器中的DELETE语句,因为它将在触发器首次触发时删除TEMP_BRANCH的内容。