简体   繁体   English

尽管结构没有不同,但仍出现 PLS-00382 错误

[英]Getting PLS-00382 error despite structure not differing

for some reason I'm getting the above error on line 31 when trying to compile the trigger to update StudentLastName, but it matches the same structure as my other IF blocks.出于某种原因,我在尝试编译触发器以更新 StudentLastName 时在第 31 行收到上述错误,但它与我的其他 IF 块匹配相同的结构。 Does anyone have a suggestion what could be causing it?有没有人有什么可能导致它的建议?

--Alex Regimbald 040605887
CREATE OR REPLACE TRIGGER SCSP_VIEW_UPDATE
INSTEAD OF UPDATE ON SCSP_VIEW FOR EACH ROW
BEGIN
IF :OLD.SectionName <> :NEW.SectionName THEN
UPDATE SECTION_AR_5887 SET SectionName = :NEW.SectionName
WHERE SectionID = :OLD.SectionID;
END IF;
IF :OLD.CourseName <> :NEW.CourseName THEN
UPDATE COURSE_AR_5887 SET CourseName = :NEW.CourseName
WHERE CourseID = :OLD.CourseID;
END IF;
IF :OLD.ProfessorFirstName <> :NEW.ProfessorFirstName
AND :NEW.ProfessorFirstName <> NULL THEN
UPDATE PROFESSOR_AR_5887 SET ProfessorFirstName = :NEW.ProfessorFirstName
WHERE ProfessorID = :OLD.ProfessorID;
END IF;
IF :OLD.ProfessorLastName <> :NEW.ProfessorLastName
AND :NEW.ProfessorLastName <> NULL THEN
UPDATE PROFESSOR_AR_5887 SET ProfessorLastName = :NEW.ProfessorLastName
WHERE ProfessorID = :OLD.ProfessorID;
END IF;
IF :OLD.SectionName <> :NEW.SectionName THEN
UPDATE SECTION_AR_5887 SET SectionName = :NEW.SectionName
WHERE SectionID = :OLD.SectionID;
END IF;
IF :OLD.StudentFirstName <> :NEW.StudentFirstName THEN
UPDATE STUDENT_AR_5887 SET StudentFirstName = :NEW.StudentFirstName
WHERE StudentID = :OLD.StudentID;
END IF;
IF :OLD.StudentLastName <> :NEW.StudentLastName THEN
UPDATE STUDENT_AR_5887 SET StudentLastName = :NEW.StudentLastName
WHERE StudentID = :OLD.StudentID;
END IF;
IF :NEW.ProfessorLastName AND :NEW.ProfessorFirstName = NULL THEN
UPDATE SECTION_AR_5887 SET ProfessorID = NULL
WHERE ProfessorID = :OLD.ProfessorID;
END IF;
END;

Adjust the following line to correct the syntax error:调整以下行以更正语法错误:

IF :NEW.ProfessorLastName IS NULL AND :NEW.ProfessorFirstName IS NULL THEN

The rest are logic misunderstandings related to the use of NULL. rest是与NULL的使用相关的逻辑误区。

Change the other NULL tests to use IS NULL or IS NOT NULL .将其他 NULL 测试更改为使用IS NULLIS NOT NULL

Tests like x = NULL as well as x <> NULL will never be true.x = NULLx <> NULL这样的测试永远不会为真。

Instead, use:相反,使用:

  • x IS NULL
  • x IS NOT NULL

Also, some tests related to NULL are unnecessary.此外,一些与 NULL 相关的测试是不必要的。 For instance:例如:

IF :OLD.ProfessorFirstName <> :NEW.ProfessorFirstName
AND :NEW.ProfessorFirstName IS NOT NULL THEN

This test for NULL is unnecessary, since the first expression :OLD.ProfessorFirstName <>:NEW.ProfessorFirstName will never be true if :NEW.ProfessorFirstName IS NULL. So the NULL test here is unnecessary.这个 NULL 的测试是不必要的,因为第一个表达式:OLD.ProfessorFirstName <>:NEW.ProfessorFirstName如果:NEW.ProfessorFirstName IS NULL 永远不会为真。所以这里的 NULL 测试是不必要的。

The following is sufficient to know that the variable/reference is NOT NULL:以下足以知道变量/引用不是 NULL:

IF :OLD.ProfessorFirstName <> :NEW.ProfessorFirstName

The fiddle小提琴

Test case:测试用例:

CREATE TABLE SCSP (
    SectionID    varchar2(20)
  , SectionName  varchar2(20)
  , CourseID     varchar2(20)
  , CourseName   varchar2(20)
  , ProfessorID  varchar2(20)
  , ProfessorFirstName varchar2(20)
  , ProfessorLastName  varchar2(20)
  , StudentID        varchar2(20)
  , StudentFirstName varchar2(20)
  , StudentLastName  varchar2(20)
);

CREATE OR REPLACE VIEW SCSP_VIEW AS
SELECT * FROM SCSP
;

CREATE TABLE SECTION_AR_5887 (
    SectionID    varchar2(20)
  , SectionName  varchar2(20)
  , ProfessorID  varchar2(20)
);

CREATE TABLE COURSE_AR_5887 (
    CourseID   varchar2(20)
  , CourseName varchar2(20)
);

CREATE TABLE PROFESSOR_AR_5887 (
    ProfessorID        varchar2(20)
  , ProfessorFirstName varchar2(20)
  , ProfessorLastName  varchar2(20)
);

CREATE TABLE STUDENT_AR_5887 (
    StudentID        varchar2(20)
  , StudentFirstName varchar2(20)
  , StudentLastName  varchar2(20)
);

CREATE OR REPLACE TRIGGER SCSP_VIEW_UPDATE
INSTEAD OF UPDATE ON SCSP_VIEW FOR EACH ROW
BEGIN
IF :OLD.SectionName <> :NEW.SectionName THEN
UPDATE SECTION_AR_5887 SET SectionName = :NEW.SectionName
WHERE SectionID = :OLD.SectionID;
END IF;
IF :OLD.CourseName <> :NEW.CourseName THEN
UPDATE COURSE_AR_5887 SET CourseName = :NEW.CourseName
WHERE CourseID = :OLD.CourseID;
END IF;
IF :OLD.ProfessorFirstName <> :NEW.ProfessorFirstName THEN
UPDATE PROFESSOR_AR_5887 SET ProfessorFirstName = :NEW.ProfessorFirstName
WHERE ProfessorID = :OLD.ProfessorID;
END IF;
IF :OLD.ProfessorLastName <> :NEW.ProfessorLastName THEN
UPDATE PROFESSOR_AR_5887 SET ProfessorLastName = :NEW.ProfessorLastName
WHERE ProfessorID = :OLD.ProfessorID;
END IF;
IF :OLD.SectionName <> :NEW.SectionName THEN
UPDATE SECTION_AR_5887 SET SectionName = :NEW.SectionName
WHERE SectionID = :OLD.SectionID;
END IF;
IF :OLD.StudentFirstName <> :NEW.StudentFirstName THEN
UPDATE STUDENT_AR_5887 SET StudentFirstName = :NEW.StudentFirstName
WHERE StudentID = :OLD.StudentID;
END IF;
IF :OLD.StudentLastName <> :NEW.StudentLastName THEN
UPDATE STUDENT_AR_5887 SET StudentLastName = :NEW.StudentLastName
WHERE StudentID = :OLD.StudentID;
END IF;
IF :NEW.ProfessorLastName IS NULL AND :NEW.ProfessorFirstName IS NULL THEN
UPDATE SECTION_AR_5887 SET ProfessorID = NULL
WHERE ProfessorID = :OLD.ProfessorID;
END IF;
END;
/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM