PL / SQL Oracle Mutant表-如何遇到这个问题plz?

时间:2019-07-19 01:58:12

标签: sql oracle sqlplus

第一个请求是确保在城市中我们只有一个分支机构, 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;
   / `

1 个答案:

答案 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的内容。