无法在Oracle / iSQL中创建触发器

时间:2011-12-15 19:29:46

标签: sql oracle

我做了一个表学生,其中有一个属性评估。 现在我正在制作一个触发器,我希望如果我在评估中插入零值,那么触发器应该触发并在audit_table中存储一些值。 这是我的代码

Create table Student ( Student_Id Number(8,2), Student_Name Varchar2(50), Gender Varchar(8), Telephone_No Number(15), Location Varchar2(200), Education Varchar2(100), Company_name Varchar2(200), No_of_attempt    Number(2), Offering_Id  Number(3) , EVALUATION NUMBER(2), Primary Key (Student_Id), Constraint fk_Oid Foreign Key (Offering_Id) References Course(Offering_Id) );

现在是审计表代码

CREATE TABLE AUDIT_TABLE ( STUD_NAME VARCHAR2(100), COURSE_NAME
VARCHAR2(100), INSTRUCTOR_NAME VARCHAR2(200), EVALUATION NUMBER (2)

);

现在我的主要问题是我的触发器无法正常工作

    create trigger tr_student
after insert or update on student
for each row
declare 
s_name student.student_name%type; 
s_eval student.evaluation%type;
s_offr_id student.offering_id%type;
s_course_name student.student_name%type;
s_instr student.student_name%type;

begin
if evaluation == 0;
s_offr_id =(select offering_id from student where evaluation==0);
s_eval =0;
s_name =(select student_name from student where evaluation==0);
s_course_name =(select course_name from course where offering_id==s_offr_id);
s_instr=(select name from instructor where offering_id==s_offr_id);
insert into AUDIT_TABLE values(s_name,s_course,s_instr,s_eval);
end; 

我的触发器有问题吗?

1 个答案:

答案 0 :(得分:3)

这是不可能的:

s_name =(select student_name from student where evaluation==0);

将其更改为

select student_name into s_name from student where evaluation = 0;

注意有两个问题。首先,您需要into来为变量选择一个值。其次,SQL中的比较运算符只有一个=

同样如此
if evaluation == 0;
  ..
end;

应该是

if :new.evaluation = 0 then
  ...
end if;

那么,您忘记了thenend if,比较运算符是错误的,您需要:new.fieldname来获取字段的值,而不是局部变量。< / p>

PLSQL中的赋值运算符是:=,所以

s_eval =0; 

应改为

s_eval := 0;

看来你需要再次抓住教科书并多做一些阅读。 :)