Oracle 我正在使PL/SQL触发到学生注册系统,但有一个可怕的问题

Oracle 我正在使PL/SQL触发到学生注册系统,但有一个可怕的问题,oracle,plsql,Oracle,Plsql,我想让学生通过触发器进入课堂。我有两张桌子:学生桌和学科桌 学生桌 Stuno Stuname ****** ******* 1001 James 1002 Jacob 1003 Misa 主题表 Subno Subname ***** ******************* 51 Computer science 52 Statistic 53 Engineering Electromagnet

我想让学生通过触发器进入课堂。我有两张桌子:学生桌和学科桌

学生桌

  Stuno  Stuname
  ****** *******
   1001  James
   1002  Jacob
   1003  Misa
主题表

   Subno  Subname
   *****  *******************
     51    Computer science
     52    Statistic
     53    Engineering Electromagnetics
我创建了注册表-它是空的

注册表

  eno   stuno   subno
  ****  ******  *********  
我想得到预期的输出是这样的

  eno   stuno   subno
  ****  ******  *********  
   1      1001    51
   2      1002    52
   3      1003    53
但唯一的问题是。。。。。写作时

 insert into Enrollments values(1,1001,51);
 insert into Enrollments values(1,1001,51)
 ERROR at line 1:
 ORA-01403: no data found
 ORA-06512: at "SCOTT.ENROLL", line 14
 ORA-04088: error during execution of trigger 'SCOTT.ENROLL'
我知道为什么这个问题。因为注册表为空…没有数据 我不知道在pl/sql中注册为空时,数据如何插入表中

这是我的编码。。。请帮帮我

 drop trigger Enroll;
 create or replace trigger Enroll
 before insert or update
 on Enrollments FOR EACH ROW
 declare 
      p_snum    student.Stuno%type;
      p_ClassNum subject.subno%type; 
      p_num_current_enrolled NUMBER; 
      p_num_max_capacity NUMBER;
 BEGIN
         p_num_current_enrolled  := 0;
         p_num_max_capacity  := 0 ;

          SELECT Count(*) into p_num_current_enrolled
          from Enrollments 
          where subno = p_ClassNum;

          SELECT capacity into p_num_max_capacity
          from subject
         where subno = p_ClassNum; 

         IF p_num_current_enrolled < p_num_max_capacity THEN
             insert into Enrollments values(null,p_snum, p_ClassNum);
             dbms_output.put_line('수강 신청을 완료 하였습니다.');
          ELSE
             dbms_output.put_line('정원이 초과 하였습니다.');
           END IF;
   end;
   /
这是选择容量。。。这引起了错误;您在WHERE子句中使用了p_ClassNum,其值为unknown NULL。它应该是:new.subno,实际上

下面是一个你可能会做的例子

首先,测试用例:

SQL> create table student (stuno number, stuname varchar2(20));

Table created.

SQL> insert into student
  2    select 1001, 'james' from dual union all
  3    select 1002, 'jacob' from dual union all
  4    select 1003, 'misa'  from dual;

3 rows created.

SQL> create table subject (subno number, subname varchar2(20), capacity number);

Table created.

SQL> insert into subject
  2    select 51, 'compsci'  , 2 from dual union all
  3    select 52, 'statistic', 3 from dual;

2 rows created.

SQL> create table enrollments (eno number, stuno number, subno number);

Table created.

SQL>
触发:

SQL> create or replace trigger trg_Enroll_1
  2    before insert on enrollments
  3    for each row
  4  declare
  5    l_num_current_enrolled number;
  6    l_capacity number;
  7  begin
  8    select count(*)
  9      into l_num_current_enrolled
 10      from enrollments
 11      where subno = :new.subno;
 12    select capacity
 13      into l_capacity
 14      from subject
 15      where subno = :new.subno;
 16
 17    if l_num_current_enrolled >= l_capacity then
 18      raise_application_error(-20000, 'No more room for that subject');
 19    end if;
 20  end;
 21  /

Trigger created.

SQL>
测试:

SQL> insert into enrollments (eno, stuno, subno)
  2    values (1, 1001, 51);

1 row created.

SQL> insert into enrollments (eno, stuno, subno)
  2    values (2, 1002, 51);

1 row created.

SQL> insert into enrollments (eno, stuno, subno)
  2    values (3, 1003, 51);
insert into enrollments (eno, stuno, subno)
            *
ERROR at line 1:
ORA-20000: No more room for that subject
ORA-06512: at "SCOTT.TRG_ENROLL_1", line 15
ORA-04088: error during execution of trigger 'SCOTT.TRG_ENROLL_1'


SQL>