--删除用户表
drop table USERS cascade constraints;--删除学生表
drop table STUDENTS cascade constraints;--删除班级表
drop table CLASSES cascade constraints;--删除课程表
drop table COURSES cascade constraints;--删除成绩表
drop table SCORE cascade constraints;--删除视图
drop view st_info ;--删除班级人数自增触发器
drop trigger class_size_inc;--删除班级人数自减触发器
drop trigger class_size_red;
--创建用户表
create table USERS (
USER_NAME varchar2(16) primary key,
USER_PASSWORD VARCHAR2(16) not null,
USER_ROLE number(1) default 1
);

--创建课程表
create table COURSES(
COURSE_ID number(16) primary key,
COURSE_NAME varchar2(30) not null unique,
COURSE_TECHER varchar2(10) not null,
COURSE_CREDIT number(2,1)  check(COURSE_CREDIT>0 and COURSE_CREDIT<30) not null,
COURSE_TYPE varchar2(10) check(COURSE_TYPE in ('全校必修','全校选修','专业必修','专业选修')) not null ,
COURSE_REMARK varchar2(100) default '无'
);
--创建班级表
create table CLASSES (
CLASS_ID number(16) primary key,
CLASS_NAME varchar(16) not null unique,
CLASS_SIZE number(2) default 0 check (CLASS_SIZE>-1 and CLASS_SIZE<51)
);
--创建学生表
create table STUDENTS(
ST_ID number(16) primary key,
ST_NAME varchar2(10) not null,
ST_SEX varchar2(4) check (ST_SEX = '男性' or ST_SEX = '女性') not null,
ST_BIRTHDAY varchar2(10) not null,
ST_MESSAGE  varchar2(30) ,
CLASS_NAME varchar2(16) not null,

constraint F_CLASS_NAME foreign key (CLASS_NAME) references CLASSES(CLASS_NAME) 
);
--创建成绩表
create table SCORE(
SCORE_ID number(16) primary key,
SCORE_RESULT number(4,1)  check(SCORE_RESULT>0 and SCORE_RESULT<=150) not null,
ST_ID number(16) not null,
COURSE_NAME varchar2(30) not null,

constraint F_ST_ID foreign key(ST_ID) references STUDENTS(ST_ID) on delete cascade,
constraint F_COURSE_NAME foreign key(COURSE_NAME) references COURSES(COURSE_NAME) on delete cascade
);
--创建视图
create or replace view st_info as 
select st.ST_ID,ST_NAME,ST_SEX,
CLASS_ID,cl.CLASS_NAME,
COURSE_ID,co.COURSE_NAME,COURSE_TYPE,COURSE_CREDIT,
SCORE_ID,SCORE_RESULT
from students st,score sc,classes cl,courses co
where st.ST_ID=sc.ST_ID and
st.class_name=cl.class_name and
sc.course_name=co.course_name
order by st.st_id;--创建触发器,添加学生,班级人数加1
create or replace trigger class_size_inc
after insert on students
for each row
declare
begin
update classes
set class_size=class_size+1
where class_name= :new.class_name;
end;

--创建触发器,删除学生,班级人数减1
create or replace trigger class_size_red
after delete on students 
for each row
declare
begin 
update classes 
set class_size = class_size-1
where class_name = :old.class_name;
end;/***测试用例 ***/--插入班级
insert into CLASSES(CLASS_ID,CLASS_NAME,CLASS_SIZE) values(192031,'信安一班',0);
insert into CLASSES(CLASS_ID,CLASS_NAME,CLASS_SIZE) values(192032,'信安二班',0);
insert into CLASSES(CLASS_ID,CLASS_NAME,CLASS_SIZE) values(192033,'信安三班',0);--插入学生
insert into students(ST_ID, ST_NAME,ST_SEX, ST_BIRTHDAY,ST_MESSAGE, CLASS_NAME) values (
19203101,'胡靖','男性','1985-01-11',13894512541,'信安一班');insert into students(ST_ID, ST_NAME,ST_SEX, ST_BIRTHDAY,ST_MESSAGE, CLASS_NAME) values (
19203102,'刘明明','男性','1985-11-04',13894512541,'信安一班');insert into students(ST_ID, ST_NAME,ST_SEX, ST_BIRTHDAY,ST_MESSAGE, CLASS_NAME) values (
19203103,'贾浩','男性','1984-09-28',13894512541,'信安一班');--插入课程
insert into courses(COURSE_ID,COURSE_NAME,COURSE_TECHER,COURSE_CREDIT,COURSE_TYPE,COURSE_REMARK) values
(1001,'高等数学','张建华',5.5,'全校必修','很难的课程哦!');
insert into courses(COURSE_ID,COURSE_NAME,COURSE_TECHER,COURSE_CREDIT,COURSE_TYPE,COURSE_REMARK) values
(1002,'大学语文','李万',2,'全校选修','国学');
insert into courses(COURSE_ID,COURSE_NAME,COURSE_TECHER,COURSE_CREDIT,COURSE_TYPE,COURSE_REMARK) values
(1003,'大学物理','王层次',3.0,'全校必修',' ');--插入成绩
insert into score(SCORE_ID,SCORE_RESULT,ST_ID,COURSE_NAME)values(9001,66,19203102,'大学物理');insert into score(SCORE_ID,SCORE_RESULT,ST_ID,COURSE_NAME)values(9004,88,19203102,'高等数学');insert into score(SCORE_ID,SCORE_RESULT,ST_ID,COURSE_NAME)values(9002,88,19203101,'大学语文');insert into score(SCORE_ID,SCORE_RESULT,ST_ID,COURSE_NAME)values(9003,50,19203103,'高等数学');select * from students;select * from classes;================================================================================================================================================================================================================================================================================================================
就上面的,放在一个PL/SQL 的SQL WINDOW里执行到创建触发器的时候,PL/SQL就停止了,也不报错,TRIGGER当然也没有创建成功.
但是如果把TRIGGER独立出来就可以了(两个TRIGGER也必须是独立的不能在一个SQL WINDOW里),因为实在MY ECLIPSE里写的,所以分成两个文件非常不方便,希望能知道怎么写在一个文件里.
因为分开就可以正常使用,所以我想是不是PL/SQL这样的合写有什么机制我不懂的?百度了半天也还是不晓得,哪位路过给点指点哦.

解决方案 »

  1.   

    我试了,不行啊,还是说我不会用这个'/'呢,我是在这个原文上,每个语句结束加一个'/',包括前面的drop,create 块.
    结果更错了...新手
      

  2.   

    这两个触发器后面加上 /--创建触发器,添加学生,班级人数加1 
    create or replace trigger class_size_inc 
    after insert on students 
    for each row 
    declare 
    begin 
    update classes 
    set class_size=class_size+1 
    where class_name= :new.class_name; 
    end; 
    /--创建触发器,删除学生,班级人数减1 
    create or replace trigger class_size_red 
    after delete on students 
    for each row 
    declare 
    begin 
    update classes 
    set class_size = class_size-1 
    where class_name = :old.class_name; 
    end; 
    /
      

  3.   

    还是不行啊虽然知道是什么地方的问题,就是触发器在创建的时候,没有把end;当然结束,继续把后面所有的语句都当作触发器定义里面去了.
    所以把触发器分开到不同的SQL WINDOW就对了.但是合在一个PL/SQL SQL WINDOW里面,即便像你给的这个,在end;后面再加上"/"还是不行,跟不加一样啊,就是无法识别怎么结束这个创建...蹉跎啊
      

  4.   

    最后加上
    end 触发器名称;
      

  5.   

    --创建触发器,添加学生,班级人数加1 
    create or replace trigger class_size_inc 
    after insert on students 
    for each row 
    declare 
    begin 
    update classes 
    set class_size=class_size+1 
    where class_name= :new.class_name; 
    end class_size_inc ; --创建触发器,删除学生,班级人数减1 
    create or replace trigger class_size_red 
    after delete on students 
    for each row 
    declare 
    begin 
    update classes 
    set class_size = class_size-1 
    where class_name = :old.class_name; 
    end class_size_red ; 
      

  6.   

    --创建触发器,添加学生,班级人数加1 
    create or replace trigger class_size_inc 
    after insert on students 
    for each row 
    declare 
    begin 
    update classes 
    set class_size=class_size+1 
    where class_name= :new.class_name; 
    end class_size_inc ; 
    /--创建触发器,删除学生,班级人数减1 
    create or replace trigger class_size_red 
    after delete on students 
    for each row 
    declare 
    begin 
    update classes 
    set class_size = class_size-1 
    where class_name = :old.class_name; 
    end class_size_red ;