触发器如下: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。只是百思不得其解,麻烦高人指点一下,叩谢~~~~
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。只是百思不得其解,麻烦高人指点一下,叩谢~~~~
你SELECT出两个列的值却INTO到1个变量里当然会报错。还有改后看有没有返回多行的问题。
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;
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;
for each row
declare
pragma autonomous_transaction;
begin
pro_grade(:old.stuid);
end;
这不是个数据库错误,这是由于你的数据库结构设计不合理造成的,
解决这个问题的方法也很简单,修改这变异表触发器就可以了,不要使用自治事务,切记