繁体   English   中英

Oracle SQL 触发语法

[英]Oracle SQL Trigger Syntax

我正在尝试创建一个触发器来检查要添加到分配表的教员是否已经在指定 class 的合格表上。 也许这是一种乏味的方法。 尽管如此,我仍然想知道我做错了什么。 以下是我的代码,其中创建了创建的表,触发器是代码的最后一部分:

代码:

CREATE TABLE Faculty (
  FId varchar(10),
  FName varchar(20),
  CONSTRAINT Faculty_ID_pk PRIMARY KEY(FId)
);

CREATE TABLE Course (
  CId varchar(10),
  CName varchar(20),
  CONSTRAINT Course_ID_pk PRIMARY KEY(CId)
);

CREATE TABLE Qualify (
  QDate DATE,
  FId varchar(10),
  CId varchar(10),
  CONSTRAINT Qualifying_date CHECK(QDate >= TO_DATE('2020-08-24', 'YYYY-MM-DD')),
  CONSTRAINT Qualify_FID_fk FOREIGN KEY(FId) REFERENCES Faculty(FId),
  CONSTRAINT Qualify_CID_fk FOREIGN KEY(CId) REFERENCES Course(CId)
);

CREATE TABLE Assign (
  ADate DATE,
  FId varchar(10),
  CId varchar(10),
  CONSTRAINT Qualifying_check CHECK(ADate > TO_DATE('2020-08-24', 'YYYY-MM-DD')),
  CONSTRAINT Assign_FID_fk FOREIGN KEY(FId) REFERENCES Faculty(FId),
  CONSTRAINT Assign_CID_fk FOREIGN KEY(CId) REFERENCES Course(CId)
);



CREATE OR REPLACE TRIGGER Check_If_Qualified
   BEFORE INSERT ON Assign
   FOR EACH ROW
DECLARE
   v_facNum number;
BEGIN
   SELECT f.FId
      into v_facNum
      from Faculty f
      where f.facnum = :new.fid;
END;

但是,我不断收到一条错误消息:

第 7 行错误:PLS-00225:子程序或 cursor 'F' 引用超出 scope

  1. v_facNum 编号;
  2. 开始
  3. SELECT f.FId
  4. 进入 v_facNum
  5. 从教师 f

有谁知道可能出了什么问题?

那将是这样的(示例表实际上只是一个示例;它们在这里是为了使触发器编译):

SQL> create table assign (fid number);

Table created.

SQL> create table faculty (facnum number, fid number);

Table created.

SQL> CREATE OR REPLACE TRIGGER Check_If_Qualified
  2    BEFORE INSERT ON Assign
  3    FOR EACH ROW
  4  DECLARE
  5    v_facNum number;
  6  BEGIN
  7     SELECT f.FId
  8       into v_facNum
  9       from Faculty f
 10       where f.facnum = :new.fid;
 11
 12    -- now do something with v_facNum
 13  END;
 14  /

Trigger created.

SQL>

您的代码中有很多问题。 您可以将记录计数检查到FACULTY表中,并将该计数用于您想要的任何逻辑。

CREATE OR REPLACE TRIGGER CHECK_IF_QUALIFIED 
    BEFORE INSERT ON ASSIGN
    FOR EACH ROW
DECLARE
    CNT   NUMBER;
BEGIN
    SELECT COUNT(1)
      INTO CNT
      FROM FACULTY
     WHERE FACNUM = :NEW.FID;
END;
/

暂无
暂无

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

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