PL/SQL之存储过程修改学生学号及触发器实现一致性

(1)创建三个表:Student(S#, Sname, age), Course(C#, cname, credit), SC(s#, c#, score),其中SC的S#和C#都是外键,分别引用Student表的S#和Course表的C#。请首先在各自表中插入若干条记录,然后用存储过程实现修改指定学生的学号。

(2)创建两个表:系表:Dept(D#, Dname, S_Count) ,其中S_count是每个系的学生人数;学生表:Stu(S#, Sname, age, D#) 其中D#是引用Dept(D#)的外键。请用触发器实现S_count和学生表中实际人数的一致性。

开发工具:PL/SQL Developer

1.建表:

Student(S#, Sname, age)表,对应SQL语句如下:

create table STUDENT
(
  S#    VARCHAR2(10) not null,
  Sname VARCHAR2(10),
  age   NUMBER,
  constraint S# primary key (S#)
);

Course(C#, cname, credit)表,对应SQL语句如下:

create table COURSE
(
  C#     VARCHAR2(10) not null,
  cname  VARCHAR2(20),
  credit NUMBER,
  constraint C# primary key (C#)
);

SC(s#, c#, score)表,对应SQL语句如下:

create table SC
(
  S#    VARCHAR2(5) not null,
  C#    VARCHAR2(5) not null,
  score NUMBER not nullconstraint SC_PK primary key (S#, C#),
  constraint C#_FK_COURSE foreign key (C#)
    references COURSE (C#) on delete cascade,
  constraint S#_FK_STUDENT foreign key (S#)
    references STUDENT (S#) on delete cascade
);

3.插入数据:

这里由于需要一次性插入多条数据,而MySQL的多行插入语法INSERT INTO 某表 VALUES(各个值),VALUES(各个值);这样会报错,因为ORACLE不支持这种写法;如果多个INSERT INTO VALUES(各个值);这样以“;”隔开一同执行也是不行的,ORACLE也是不支持。

但是在这里我们可以利用ORACLE 9i版本以后的语法,即”INSERT ALL INTO a表 VALUES(各个值) INTO a表 VALUES (其它值) INTO a表 VALUES(其它值) ….再跟一个SELECT 语句“。后边跟的SELECT 语句我们可以从虚拟表里查如 SELECT 1 FROM DUAL。

Student(S#, Sname, age)表,对应SQL语句如下:

insert all into student(s#,sname,age) values ('001','小A',
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值