使用函数 Oracle 触发
Trigger with a function Oracle
我需要创建触发器以插入 'A'(对于已批准的学生)和 'R'(对于未批准的学生)。我需要使用 returns '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;
当我尝试执行时,我总是遇到错误。我不知道我能做什么!
触发器中允许使用用户定义的函数,您的函数看起来没问题。
你的触发器有一个明确的问题是它提到了 grade
和 frequency
,它们是变量名,而且它们还没有被声明。我假设您可能打算改用插入的列值::new.grade
和 :new.frequency
.
此外,我总是使用简单的变量赋值(:new.value := blah
而不是 select blah into :new.value from dual
)来设置 "new" 值。您的方法可能有效(或可能无效 - 我不知道),但简单的变量赋值语法要短得多,而且很容易阅读。
所以尝试替换这三行:
select check_grade(grade, frequency)
into : new.situation
from dual;
...这一行:
:new.situation := check_grade(:new.grade, :new.frequency);
如果这不起作用,请更新问题并将 "I always get an error" 替换为 I get error ORA- 。包括堆栈跟踪,它将显示函数或触发器是否正在抛出。
这里不需要该功能;可以用 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;
我需要创建触发器以插入 'A'(对于已批准的学生)和 'R'(对于未批准的学生)。我需要使用 returns '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;
当我尝试执行时,我总是遇到错误。我不知道我能做什么!
触发器中允许使用用户定义的函数,您的函数看起来没问题。
你的触发器有一个明确的问题是它提到了 grade
和 frequency
,它们是变量名,而且它们还没有被声明。我假设您可能打算改用插入的列值::new.grade
和 :new.frequency
.
此外,我总是使用简单的变量赋值(:new.value := blah
而不是 select blah into :new.value from dual
)来设置 "new" 值。您的方法可能有效(或可能无效 - 我不知道),但简单的变量赋值语法要短得多,而且很容易阅读。
所以尝试替换这三行:
select check_grade(grade, frequency)
into : new.situation
from dual;
...这一行:
:new.situation := check_grade(:new.grade, :new.frequency);
如果这不起作用,请更新问题并将 "I always get an error" 替换为 I get error ORA-
这里不需要该功能;可以用 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;