日期:2014-05-17  浏览次数:20696 次

怎么去设计呢
如果说 是做的一个网上选课系统,需要控制一个课程的选课人数,可以在选课表上面加一个字段最大选课人数,和当前选课人数 对吧? 可不可以去设计一个 函数或者说过程 去实现当插入一条选课数据的时候 判断当前这门课程的最多选课人数,如果小于就可以插入,不行就不能插入,??? 如果可以希望 举个例子 或者代码

------解决方案--------------------
1)一个课程表,包含最大选题人数
2)选题表,不用设置已选人数字段
3)触发器instead of实现超员则不插入数据,like this:

CREATE OR REPLACE TRIGGER simo_tab_insert
       INSTEAD OF INSERT ON v_simo_tab
    BEGIN
      declare
      v_id number;
      begin
      select count(*) into v_id from simo_tab where name = :new.name;
      dbms_output.put_line('Simo>>>>>>>>v_id:'
------解决方案--------------------
v_id);
      if v_id>0 then
        insert into simo_tab(id, name)
            values (:NEW.id,:new.name);
      end if;
      end;
   END;

------解决方案--------------------
引用:
Quote: 引用:

下面的就能实现你要做的啊,你觉得有什么问题么??
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;


你写的异常我没看懂 ,还有返回值 也没看懂,能否用过程来写

他是通过函数来判断是否对表有进行更改。如果函数返回1表明选课成功并且插入了记录和更改了当前选课的人数(+1),如果返回0,表明人数已满,选课不成功。
这样做和用过程做没什么区别啊。