sql学习-2

游标

create procedure proSearchItem1(@empNo char(5),@status tinyint output)
as
begin
  declare @empName char(10)
  declare @prod_id char(5),@qty int,@price decimal(7,2)
  declare @itemMoney decimal(10,2),@totMoney decimal(10,2)
  create table #myDemo
    (prod_id char(5),
     qty     int,
     unitPrice decimal(7,2),
     itemMoney decimal(10,2))
  select @empName=emp_name from employee
     where emp_no=@empNo
  if @@rowcount<=0
  begin
    set @status=-1
    return
  end
  select '销售员姓名:'+@empName
  select @totMoney=0
  declare mySearch cursor for
     select prod_id,qty,unit_price
     from sales a,sale_item b
     where a.sale_id=@empNo and a.order_no=b.order_no
  open mySearch
  fetch mySearch into @prod_id,@qty,@price
 
  while @@fetch_status=0
  begin
    select @itemMoney=@qty*@price
    insert into #myDemo values(@prod_id,@qty,@price,@itemMoney)
 
    set @totMoney=@totMoney+@itemMoney
    fetch mySearch into @prod_id,@qty,@price
  end
  close mySearch
  deallocate mySearch
  select * from #myDemo
  select '总货款:'+convert(char(10),@totMoney)
  set @status=0
end 

 

触发器

1设置一个触发器,该触发器仅允许“dbo”用户可以删除employee表内数据的,否则出错

create trigger delelteemployee1

on employee

for delete

as

begin

 if user='dbo'

       commit

else

       begin

              print 'not dbo'

              rollback

       end

end

.................

delete

from employee

where emp_no='e0017'

.................

select * from employee

drop trigger delelteemployee1

2设置一个针对employee表的触发器,当有人操作该表值时,触发器将自动将该操作者的名称和操作时间记录在日志表内,以便追踪。

create table mylog

(

    id  int not null primary key,

    uid char(10) not null,

    operateDate datetime not null,

type varchar(20) not null)

…………………………

create  trigger Del on employee

for delete

as

begin

   declare @id int,@maxID int

   select @maxID=isnull(max(id),0) from mylog

   select @maxID=@maxID+1

   insert into mylog values(@maxID,current_user,getdate(),'delete')

end

……………………….

delete from employee where emp_no='E1002'

select *  from mylog

drop trigger Del

………………………….

3针对employee表写一个DELETE触发器

create trigger delemployee

on employee

for delete

as

begin

    declare @emp_no char(5)

    declare mycur cursor for

    select emp_no from deleted

    open mycur

    fetch mycur into @emp_no  

    while @@fetch_status=0

        begin

select order_no from sales where sale_id=@emp_no

              select * from sale_item where order_no in

       (select order_no from sales where sale_id=@emp_no)

         delete from sale_item where  order_no in

              (select order_no from sales where sale_id=@emp_no)

           delete from sales where sale_id=@emp_no

            fetch mycur into @emp_no

            commit

        end

    close mycur

    deallocate mycur

end

............................

delete from employee where emp_no='e0001'

4针对employee表写一个UPDATE触发器

create trigger update_emp

on employee for update as

declare @salary1 int,@salary2 int

 If(select count(*) from employee,inserted

    Where employee.emp_no=inserted.emp_no)

             !=@@rowcount

             Rollback

If(select count(*) from employee,inserted

          Where employee.emp_no=inserted.emp_no)             >1

  begin

    print 'This operation may modify records in the table employee'

rollback

transaction

  end

 if update(emp_no)and @@rowcount=1

 Begin

        update sales

set sales.sale_id=inserted.emp_no

        From sales,deleted,inserted

        Where deleted.emp_no=sales.sale_id

end

if update(salary) 

begin

set  @salary1= (select deleted.salary from deleted )

set  @salary2= (select inserted.salary from inserted )

print 'before modifying:'

print @salary1

print 'after modifying:'

print @salary2

 end

update employee

set salary=4000

where emp_no='E19' select *from employee

存储过程

create procedure proaddemployee
 @emp_no char(5),
 @emp_name char(10),
 @sex char(1) ,
 @dept char(10),
 @title char(6),
 @date_hired datetime,
 @birthday datetime,
 @salary int,
 @addr char(50)   
 as
 insert into employee values (@emp_no,@emp_name,@sex,@dept,@title,@date_hired,@birthday,@salary,@addr)
 go
 exec proaddemployee 'e0018','王有功','m','财务部','职员','08/28/2008','08/21/1981',5000,null
 select *
 from employee
.................................................................
alter procedure proesc
 as
begin
 declare @emp_no char(5),@emp_name char(10),@ccust_id char(5), @cust_name char(20),@scust_id char(5) ,@sale_id char(5) ,@tot_amt numeric(9,2)
 declare @sum numeric(18,2),@pemp_name  char(10),@pcust_name char(20)
 declare @f int
 declare joinesc cursor for
 select emp_no,emp_name,b.cust_id,cust_name,c.cust_id,c.sale_id,tot_amt
 from employee a,customer b,sales c
 where a.emp_no=c.sale_id and b.cust_id=c.cust_id
 order by emp_no,b.cust_id
 open joinesc
 fetch joinesc into @emp_no,@emp_name,@ccust_id, @cust_name,@scust_id,@sale_id,@tot_amt
 set @pemp_name=@emp_name
 set @pcust_name=@cust_name
 set @sum=0
 set @f=0
 while @@fetch_status=0
  begin
    /*set @sum=0
   while @emp_name= @pemp_name and @cust_name= @pcust_name
   begin
   set @sum=@sum+@tot_amt
   fetch joinesc into @emp_no,@emp_name,@ccust_id, @cust_name,@scust_id,@sale_id,@tot_amt
   end
   if @sum=0
   
   begin
   set @sum=@tot_amt
   end
     select @pemp_name,@pcust_name,@sum
   set @pemp_name=@emp_name
   set @pcust_name=@cust_name
   fetch joinesc into @emp_no,@emp_name,@ccust_id, @cust_name,@scust_id,@sale_id,@tot_amt*/
   if @emp_name= @pemp_name and @cust_name= @pcust_name
    begin
    set @sum=@sum+@tot_amt
    end
   else
    begin
    set @f=1
    end
   if @f=1
    begin
    select @pemp_name,@pcust_name,@sum
    set @sum=@tot_amt
    set @pemp_name=@emp_name
    set @pcust_name=@cust_name
    set @f=0
    end
   fetch joinesc into @emp_no,@emp_name,@ccust_id, @cust_name,@scust_id,@sale_id,@tot_amt
    
  end
  
 close joinesc
        Deallocate joinesc
end
         


exec proesc
.............
alter procedure findemployee
as
select sale_id,order_no,sum(tot_amt)
from sales
group by sale_id,order_no
having sale_id in
(select emp_no
from employee
where emp_name='张三')

exec findemployee
...............................
create  procedure searchman
as
begin
 
 declare search cursor for
 select emp_no
 from employee
 where emp_name like '甘%' and title='职员'
 open search
 declare @saleid char(5)
 fetch search into @saleid
 while @@fetch_status=0
 begin 
  select sale_id,order_no,tot_amt
  from sales
  where sale_id=@saleid
    fetch search into @saleid
 end
 close search
 Deallocate search
end

exec searchman


.......................................
create procedure sumtot_amt
as
select sum(qty*unit_price)
from sale_item
group by order_no
having order_no='00001'


exec sumtot_amt
...................................

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值