你这里addstu字段是不是应该放在tb_course表里;
同时这个表还订制一个maxnum字段记录30是最大数,
每插入一条对应课程学生关系记录到tb_fin_course,就同时更新tb_course.addstu加1,判断不超过maxnum=30的前提下,以上都可以在一个存储过程中实现

解决方案 »

  1.   

    建一个触发器就可以了,刚写了一个测试用的,给你参考。SQL> CREATE TABLE idletest(ID NUMBER);
     
    Table created
    SQL> CREATE OR REPLACE TRIGGER idletesttrigger BEFORE INSERT ON idletest
      2  DECLARE v NUMBER;
      3  BEGIN
      4    SELECT COUNT(ID) INTO v FROM idletest;
      5    IF v >= 3 THEN
      6      RAISE_APPLICATION_ERROR(-20001, 'max is 3');
      7      END IF;
      8  END;
     
      9  /
     
    Trigger created
     
    SQL> 
    SQL> INSERT INTO idletest VALUES(1);
     
    1 row inserted
    SQL> INSERT INTO idletest VALUES(2);
     
    1 row inserted
    SQL> INSERT INTO idletest VALUES(3);
     
    1 row inserted
    SQL> INSERT INTO idletest VALUES(4);
     
    INSERT INTO idletest VALUES(4)
     
    ORA-20001: max is 3
    ORA-06512: 在 "RCOTRPR1.IDLETESTTRIGGER", line 5
    ORA-04088: 触发器 'RCOTRPR1.IDLETESTTRIGGER' 执行过程中出错
     
    SQL> 
      

  2.   

    你说的 每次插入一条对应课程学生关系记录 到 fin-course表中 这个是什么 ,我没看懂,希望你把整个过程的详细代码截个图,我才开始初学,这不是都搞了一天了,老呆都晕了。还是没想出怎么用代码去实现
      

  3.   

    你说的 每次插入一条对应课程学生关系记录 到 fin-course表中 这个是什么 ,我没看懂,希望你把整个过程的详细代码截个图,我才开始初学,这不是都搞了一天了,老呆都晕了。还是没想出怎么用代码去实现
    create or replace function fun_st_course(crno in number, stno in number,stno in number) return integer is
     PRAGMA AUTONOMOUS_TRANSACTION; 
      Result integer;
      v_mx number;
      v_cur number;
    begin
      select maxnum,course_curnum into v_mx,v_cur from tb_course where CourseNo=crno;
      if v_mx>=v_cur+1 then
    insert into tb_fin_course(CourseNo,StudentNo,TeacherNo) values (crno,stno,stno);
      update tb_course set course_curnum=course_curnum+1 where CourseNo=crno;
      commit;
      Result:=1;
      return(Result);
      else 
       Result:=0;
       return(Result);
    end if;
    end fun_st_course;
    SQL> exec :abc:=fun_st_course(1234,002,300);
     
    PL/SQL procedure successfully completed
    abc
    ---------
    1