0

我需要触发一个触发器,在获得批准的学生的情况下插入“A”,在未获得批准的学生的情况下插入“R”。我需要使用返回“A”或“R”的函数。这是我的功能:

create or replace function check_grade
(grade in number, frequency in number) return varchar2
as 
result varchar2(1) default '';
begin
if(grade>=6) and (frequency>=0.75)then
result := 'A';
else
result := 'R';
end if;
return result;
end;

这是我的触发器:

create or replace trigger situation
before 
insert on student
for each row
begin
select check_grade(grade, frequency)
into : new.situation
from dual;
end;

当我尝试执行时,总是会出错。我不知道我能做什么!

4

2 回答 2

1

触发器中允许使用用户定义的函数,并且您的函数看起来没问题。

您的触发器的一个明确问题是它提到gradeand frequency,它们是变量名,并且它们没有被声明。我假设您可能打算使用插入的列值::new.grade:new.frequency.

另外,我总是使用简单的变量赋值(:new.value := blah而不是select blah into :new.value from dual)来设置“新”值。您的方式可能有效(也可能无效——我不知道),但简单的变量赋值语法要短得多,而且很容易阅读。

所以尝试替换这三行:

select check_grade(grade, frequency)
into : new.situation
from dual;

...用这一行:

:new.situation := check_grade(:new.grade, :new.frequency);

如果这不起作用,请更新问题并将“我总是收到错误”替换为我收到错误 ORA-<actual-error-number>。包括堆栈跟踪,它将显示函数或触发器是否正在抛出。

于 2015-05-15T00:08:08.230 回答
0

这里不需要这个函数;它可以用 CASE 表达式替换:

create or replace trigger situation
  before insert on student
  for each row
begin
  :new.situation := CASE
                      WHEN grade >= 6 and frequency >= 0.75 THEN 'A'
                      ELSE 'R';
                    END;
end situation;
于 2015-05-15T02:54:15.970 回答