有2个表
student学生表
----------------------------------------------------------------------------
sno sname sage ssex sxiexing sclass sjiguan shjxz szcode stel 
学号                          班级score
--------------------------------------------------------------------------------------
ssno  course1 course2 course3 course4 course5 course6 course7 course8 course9 course10
学号course1-course10分表代表十门课程,课程是分班级的,这里分两个班级(11班,22班),21班的课程是
(course1,course2,course3,course7,course9)剩下的是11班的课程。目的是要通过存储过程在score表中插入成绩,由于两个班的课程不一样,故插入成绩的时候要考虑往哪个课程插入的问题。我是想通过IF语句判断出是哪个班的 ,再通过insert into score(course1,course2,course3,course7,course9) 
values(&course1,&course2,&course3,&course7,&course9) 
else
insert into score(course4,course5,course6,cours8,course10) 
values(&course4,&course5,&course6,&cours8,&course10) 
插入成绩,老是提示过程有编译错误,麻烦各位帮忙指点下啊~~

解决方案 »

  1.   

    那这样存储过程不好写了呢肯定有一个字段是sno学号吧,其他就是5个或者10个分数了
      

  2.   

    是呀  是要第二个表输入的ssno学号和第一个表中的sno一致,然后根据学号判断出班级,再根据班级情况考虑插入成绩的是哪些课程~
      

  3.   

    create or replace procedure proc(
       v_sno    in varchar2,
       v_score1 in number,
       v_score2 in number,
       v_score3 in number,
       v_score4 in number,
       v_score5 in number)
    is 
       v_class  vaarchar2(20);
    begin   select sclass into v_class from student where sno = v_sno;
       if v_class = '11' then
          insert into score(sno,course1,course2,course3,course7,course9)
          values (v_sno,v_score1,v_score2,v_score3,v_score4,v_score5);
       else
          insert into score(sno,course4,course5,course6,cours8,course10)
          values (v_sno,v_score1,v_score2,v_score3,v_score4,v_score5);
       end;exception
       when no_data_found then
          dbms_output.put_line('No such student');
       when others then 
          raise;
    end proc;
    /
      

  4.   

    不客气,这个procedure是按照5个分数,不确定是哪些课
      

  5.   

    恩 看见这个打错了is 
       v_class  vaarchar2(20);
      

  6.   

    我还是不大明白,select sclass into v_class from student where sno = v_sno;
    这里v_sno还是空的,还没输入呢,要到下面才输入,这样怎么能判断sno=v_sno呢
      

  7.   

    不会呀,sno不是在开始时候输入的吗?这个是输入参数调用直接:execute proc('1234',80,80,90,90,90);类似这样
      

  8.   

    呵呵 刚才问题已经解决了 但是论坛不让三连
    不好意思~麻烦你再帮我看个问题吧  是两张表互相同步更新的问题先建2张表create table a
    (
        a_id number,
        a_name  varchar2(20)
    )create table b
    (
        b_id number,
        b_name  varchar2(20)
    )各自添加个字段默认为1,为了防止死循环,我每次UPDTAE的时候都先将它置0,alter table a add a_no number(1) default 1; 
    alter table b add b_no number(1) default 1;
    create or replace trigger upd_b
    after update on b
    for each row
    when (new.b_no = 1)
    begin
      update a set a_id=:NEW.b_id,a_name=:new.b_name,a_no=0 where a_no=1;
    end upd_b;
    create or replace trigger upd_a
    after update on a
    for each row
    when (new.a_no = 1)
    begin
      update b set b_id=:NEW.a_id,b_name=:new.a_name,b_no=0 where b_no=1;
    end upd_a;
    可是怎么也不触发~~也不提示错误,不知道哪里不对了~~
      

  9.   

     update a set a_id=:NEW.b_id,a_name=:new.b_name,a_no=0 where a_no=1;
    这里不能where a_no=1 对不不然就全更新了~还是不知道怎么回事
      

  10.   

    不好意思 ,今天有点忙没上来我的意思是两个表互相更新,a表更新数据后b表也更新反之b表更新a表也更新一次是更新一条还是多条的应该不影响吧,更新多少条是where条件决定的吧~
      

  11.   

    我测试是可以的Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 
    SQL> set serveroutput on
    SQL> 
    SQL> create table a
      2  (
      3      a_id number,
      4      a_name  varchar2(20),
      5      a_no number
      6  );Table createdSQL> create table b
      2  (
      3      b_id number,
      4      b_name  varchar2(20),
      5      b_no number
      6  );Table createdSQL> create or replace trigger upd_b
      2  after update on b
      3  for each row
      4  when (new.b_no = 1)
      5  begin
      6    update a set a_id=:NEW.b_id,a_name=:new.b_name,a_no=0 where a_no=1;
      7  end upd_b;
      8  /Trigger createdSQL> create or replace trigger upd_a
      2  after update on a
      3  for each row
      4  when (new.a_no = 1)
      5  begin
      6    update b set b_id=:NEW.a_id,b_name=:new.a_name,b_no=0 where b_no=1;
      7  end upd_a;
      8  /Trigger createdSQL> select * from a;      A_ID A_NAME                     A_NO
    ---------- -------------------- ----------
             1 test1                         1SQL> select * from b;      B_ID B_NAME                     B_NO
    ---------- -------------------- ----------
             2 test2                         1
    SQL> update b set b_id = 4, b_name = 'abc';1 row updatedSQL> select * from a;      A_ID A_NAME                     A_NO
    ---------- -------------------- ----------
             4 abc                           0
    SQL> 
      

  12.   

    更新多行是因为你的条件呀,where a_no=1
    这会导致所有a_no为1的记录都被更新。
      

  13.   

    create or replace trigger linshi
    after insert or update on b
    for each row
    when (new.b_no = 1)
    begin
    if inserting then
      insert into a(a_id, a_name, a_no)
    values (:new.b_id, :new.b_name, 0);
    else
       update a set a_id=:NEW.b_id,a_name=:new.b_name,a_no=0 where a_no=:new.b_no;
       end if;
    end linshi;create or replace trigger linshi2
    after insert or update on a
    for each row
    when (new.a_no = 1)
    begin
    if inserting then
      insert into b(b_id, b_name, b_no)
    values (:new.a_id, :new.a_name, 0);
    else
       update b set b_id=:NEW.a_id,b_name=:new.a_name,b_no=0 where b_no=:new.a_no;
       end if;
    end linshi;真麻烦呀  a_no和b_no本来是为了前面插入值的时候不至于死循环
              可是后面要update的时候感觉a_no和b_no会变0和1很乱
              老是不能正确更新
      

  14.   

    现在的问题是必须when new.a_no=1和when new.b_no=1成立时候才能正确更新,而这个条件只适用于insert的时候,而insert的时候为了避免死循环要改变a_no和b_no的值总之来说就是update 表a的时候必须保证你 update的那行a_no=1才能触发同步更新表bb表也是样的~
      

  15.   

    问题勉强解决了三连了begin
     delete from b where b_id=:old.a_id;delete触发器这样写为什么不触发呢。