数据库(SQL Server )经典例题(四):对S表、P表、J表、SPJ表的操作——数据库编程

一、运行环境说明
1、电脑环境:win10
2、数据库软件:SQL Server 2008 R2

二、经典例题原型
题目1:设有一个 SPJ 数据库,包括 S、P、J 及 SPJ 4 个关系模式:

   S (SNO,SNAME,STATUS,CITY) ;
   P (PNO,PNAME,COLOR,WEIGHT) ;
   J (JNO,JNAME,CITY) ;
   SPJ (SNO,PNO,JINO,QTY) ;

应商表 S 由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。

零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。

工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。
数据库(SQL Server )经典例题(四):对S表、P表、J表、SPJ表的操作——数据库编程_第1张图片题目2:商品出库表、入库表、库存表的设计

三、经典例题
1、创建一个存储过程,以供应商号为参数,输出该供应商所在城市,如果不存在该供应商,则显示“该供应商不存在!”。

create procedure SNO_CITY @SCITY nchar(4) output,@SNO char(2)  
as
if exists (select *  from S where SNO=@SNO)
select  @SCITY=CITY
from  S
where SNO=@SNO;
else print'没有该供应商'

2、创建一个函数,以供应商号为参数,返回该供应商供应零件的总数量。如果不存在该供应商,则返回-100;如果该供应商没有供应零件,返回0。

create function SN0_QTY(@SNO CHAR(4))  
returns INT
as
begin
declare @result  INT
if  not exists (select  *  from SPJ where  SNO= @Sno)
    set @result=-100
else
    if  not exists (select  PNO  from SPJ where  SNO= @Sno)
       set @result=0
else
       select @result=QTY from SPJ where SNO= @SNO
       return @result
end

3、创建一个存储过程,以SNO、PNO、JNO、QTY作为参数,将SPJ表该供应记录的供应量值修改为QTY。如果修改成功,则显示“修改成功!” ;如果不存在该供应记录,则显示“没有修改任何数据!”。

create procedure SNO_CITY2 @SNO char(4),@PNO char(4),@JNO char(4),@QTY smallint  
as
if not exists (select *  from SPJ where SNO=@SNO and PNO=@PNO and JNO=@JNO and  QTY=@QTY)
print'没有修改任何数据'
else
update SPJ
set  QTY=@QTY;
print '修改成功'

(4) 创建入库表、出库表、库存表:

create table tab_rk
(spbh int,rkrq datetime,rksl int);
create table tab_ck
(spbh int,ckrq datetime,cksl int);
create table tab_kc
(spbh int, kcsl int); 

(4)在入库表上创建一个插入触发器,实现库存表的自动更新。

create trigger  tab_rk_insert on tab_rk   --入库表插入,库存表更新
for  insert
As
declare  @spbh int
declare  @rksl int
set @spbh=(select spbh from inserted)
set @rksl=(select rksl from inserted)
if  not exists(select * from tab_kc where spbh=@spbh)
begin
insert into tab_kc  
values(@spbh,@rksl);                 
    return;
end
update tab_kc 
set  kcsl=kcsl+@rksl 
where spbh=@spbh;

(5)在入库表上创建一个删除触发器,实现库存表的自动更新。

create trigger  tab_rk_delete on tab_rk     
 for  delete
 as
 declare  @spbh int
 set @spbh=(select spbh from deleted)
 begin
     delete from tab_kc                
     where spbh=@spbh;
 end

(6)在入库表上创建一个修改触发器,实现库存表的自动更新。

create trigger  tab_rk_update on tab_rk  
for  update
as
declare  @spbh int
declare  @rksl int
set @spbh=(select spbh from deleted)
set @rksl=(select rksl from inserted)
begin
    update tab_kc 
    set  kcsl=@rksl 
    where spbh=@spbh;
end

(7)在出库表上创建一个插入触发器,实现库存表的自动更新。

create trigger  tab_ck_insert on tab_ck  
for  insert
as
declare  @spbh int
declare  @cksl int
set @spbh=(select spbh from inserted)
set @cksl=(select cksl from inserted)
if  exists(select * from tab_kc where spbh=@spbh)
begin                          
    update tab_kc 
    set kcsl=kcsl-@cksl 
    where spbh=@spbh;
end

(8)在出库表上创建一个删除触发器,实现库存表的自动更新。

create trigger  tab_ck_delete on tab_ck   
for  delete
as
declare  @spbh  int
declare  @cksl  int
set @spbh=(select spbh from deleted)
set @cksl=(select cksl from deleted)
begin
    update tab_kc 
    set kcsl=kcsl+@cksl 
    where spbh=@spbh;   
end

(9)在出库表上创建一个修改触发器,实现库存表的自动更新。

create trigger  tab_ck_update on tab_ck  
for  update
as
declare  @spbh int
declare  @cksla int
declare  @ckslb int
set @spbh=(select spbh from deleted)
set @cksla=(select cksl from deleted)
set @ckslb=(select cksl from inserted)
begin
     update tab_kc 
     set  kcsl=kcsl+@cksla-@ckslb
     where spbh=@spbh;
end
  

不足之处请大家多多批评指正!!!如有借鉴请评论和点赞!!!

你可能感兴趣的:(数据库,mysql,数据库,sqlite,SQLServer,c语言)