触发器如下:create or replace trigger trigger_grade after update of mathgrade,enggrade on student
for each row
begin
pro_grade(:old.stuid);
end;过程如下:
create or replace procedure pro_grade (id number)
is
type myrecord is record(
mathgrade student.mathgrade%type,
enggrade student.enggrade%type);
v_record myrecord;
begin
select mathgrade,enggrade into v_record from student where stuid=id;   --系统提示问题在这里
end;每次向student表执行更新时,系统都提示表已经更改,执行过程出错。错误提示位置就是过程的select那行。我自己试来试去,发现在我上述的模式中,只要在存储过程中有select语句,系统就出这个错,我屏蔽这句,就ok。只是百思不得其解,麻烦高人指点一下,叩谢~~~~

解决方案 »

  1.   

    select mathgrade,enggrade into v_record from student where stuid=id;
    你SELECT出两个列的值却INTO到1个变量里当然会报错。还有改后看有没有返回多行的问题。
      

  2.   

    --使用游标试一下:create or replace procedure pro_grade (id number) 
    is 
    mathgrade student.mathgrade%type; 
    enggrade student.enggrade%type; 
    v_1 number(8); 
    v_2 number(8); 
    cursor c1 is select mathgrade,enggrade from student where stuid=id;
    begin 
    open c1;
    fetch c1 into v_1,v_2;
     dbms_output.put_line(v1);
     dbms_output.put_line(v2);   
    end; 
      

  3.   

    --试一下:create or replace procedure pro_grade (id number) 
    is 
    mathgrade student.mathgrade%type; 
    enggrade student.enggrade%type; 
    v_1 number(8); --如是字符可用varchar2(18)
    v_2 number(8); --同上
    cursor c1 is select mathgrade,enggrade from student where stuid=id;  
    begin 
    open c1;
    fetch c1 into v_1,v_2;
    dbms_output.put_line(to_char(v_1)); --如是字符可以:dbms_output.put_line(v_1);
    dbms_output.put_line(to_char(v_2)); --同上  
    end;
      

  4.   

    这个问题本身是oracle特有的。你的触发器是针对student的,而后你又想在触发器时读或更新student对应的那一行,所以oracle才报这个错。
      

  5.   

    你这里,要访问的那一行已经修改了(当前记录已更改,更改之前的记录被放到了undo), 这时候再去访问更改的那一行,oracle该取修改之前的呢?还是修改之后 ?解决这个问题的方法是使用自治事务(虽然不建议这么做)create or replace trigger trigger_grade after update of mathgrade,enggrade on student 
    for each row 
    declare
    pragma autonomous_transaction; 

    begin 
    pro_grade(:old.stuid); 
    end; 
      

  6.   

    这个问题在Oracle中叫做变异表,就是在操作表A的会话周期内,相关的动作同时对表A也进行了操作
    这不是个数据库错误,这是由于你的数据库结构设计不合理造成的,
    解决这个问题的方法也很简单,修改这变异表触发器就可以了,不要使用自治事务,切记
      

  7.   

    可以用标签直接fetch into 到结构体