触发器与行转列

    Create Trigger OverTime
       On T056F120    --加班記錄修改                 
       for Update                      
     As                                      
       if Update(modify_time)           
       begin       
         Update T089F120
           Set field63=case when i.field9=1 then '一般加班' when i.field9=2 then '兩倍加班' when i.field9=3 then
           '三倍加班' else '' end +'<br>'+convert(varchar(20),i.field17,120) +'<br>'+convert(varchar(20),i.field18,120)
           From T089F120 a , Deleted   d ,Inserted i   
           Where a.field51= convert(varchar(20), d.field17,111) and d.field46=a.field43
       end   
     
      
      
       CREATE Trigger Overtime_insert
       On T056F120    --加班記錄插入                
       for insert                      
     As                                                
       begin 
       declare @type int
       declare @begintime datetime
       declare @endtime datetime
       declare @emp_id varchar(20)
       select @type=field9 ,@begintime=field17,@endtime=field18,@emp_id=field46 from Inserted     
         Update T089F120
           Set field63=case when @type=1 then '一般加班' when @type=2 then '兩倍加班' when @type=3 then
           '三倍加班' else '' end +'<br>'+convert(varchar(20),@begintime,120) +'<br>'+convert(varchar(20),@endtime,120)
           where field51=convert(varchar(20),@begintime,111)  and field43=@emp_id   
         print(@emp_id+convert(varchar(20),@begintime,111)+'     '+cast( @endtime as varchar(100)))
       end   

 

 

 

 

      
      
      
    Create Trigger Jholiday
       On T055F120    --請假記錄修改                 
       for Update                      
     As                                      
       if Update(modify_time) 
         begin
        declare @count  int
        declare @i int
        select @count=max(id) from Inserted
        print(@count)      
       set @i=1
       while @i<=@count   
       begin 
         if exists(select * from Inserted where id=@i)
          begin
         declare @temp varchar(20)
         declare @datebegin datetime
         declare @dateend datetime
         declare @emp_id varchar(20)
              select @temp=field6 from T064F010 where field1 = (select field41 from Inserted where id=@i)
              select @emp_id=field51,@datebegin=field17,@dateend=field18 from Inserted where id=@i           
         Update T089F120
           Set field60=@temp+'<br>'+convert(varchar(20),@datebegin,120) +'<br>'+convert(varchar(20),@dateend,120) 
           Where field51 between convert(varchar(10), @datebegin,111) and convert(varchar(10), @dateend,111)  and @emp_id=field43
         end
        set @i=@i+1
       end   
      

 

CREATE Trigger Jholiday_insert
       On T055F120    --加班記錄插入               
       for insert                      
     As                                                
       begin 
       declare @type varchar(20)
       declare @temp varchar(20)
       declare @begintime datetime
       declare @endtime datetime
       declare @emp_id varchar(20)
       select @type=field41 ,@begintime=field17,@endtime=field18,@emp_id=field51 from Inserted
       select @temp=field6 from T064F010 where field1 =@type     
         Update T089F120
           Set field60= @temp+'<br>'+convert(varchar(20),@begintime,120) +'<br>'+convert(varchar(20),@endtime,120)
           where field51 between convert(varchar(10),@begintime,111) and convert(varchar(10),@endtime,111)  and field43=@emp_id   
         print(@emp_id+convert(varchar(20),@begintime,111)+'     '+cast( @endtime as varchar(100)))
       end   

 

 


//實例
CREATE Trigger mytri
       On division                     
       for Update                      
     As                                      
       if Update(name)           
       begin
         declare @name varchar(20)
         declare @id varchar(10)
        declare @count  int
        declare @i int
        declare @sql varchar(50)
       --  select @name=name from Inserted
         select @count=max(id) from Inserted
        print(@count)
       set @name=''
       set @i=1
       while @i<=@count
       begin  
  print(@i)
            if exists (select * from Inserted where id=@i)
            begin
            select @name=name from Inserted where id=@i
          Update address_book
           Set name1=@name
           From address_book a
           Where a.division_id=@i
         print(@name)
        end
     set @i=@i+1
      end
        --  raiserror('??!?卷??存小于等于0,不能?售',16,1)
        --  rollback
        --  return
       end   

 

 

 

 

create table tb(studentId varchar(10) ,studentName varchar(10) , course varchar(10) , studentScore int)
insert into tb values('1083' ,'name1' , 'chinese' , 75)
insert into tb values('1083' ,'name1' , 'math' , 84)
insert into tb values('1083' ,'name1' , 'English' , 92)
insert into tb values('1084' ,'name2' , 'chinese' , 84)
insert into tb values('1084' ,'name2' , 'math' , 93)
insert into tb values('1084' ,'name2' , 'English' , 87)
go

--SQL SERVER 2000
select studentId,studentName,
  max(case course when 'chinese' then studentScore else 0 end) chinese,
  max(case course when 'math' then studentScore else 0 end) math,
  max(case course when 'English' then studentScore else 0 end) English
from tb
group by studentId,studentName


declare @sql varchar(8000)
set @sql = 'select studentId,studentName'
select @sql = @sql + ' , max(case course when ''' + course + ''' then studentScore else 0 end) [' + course + ']'
from (select distinct course from tb) as a
set @sql = @sql + ' from tb group by studentId,studentName'
exec(@sql)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Oracle触发器是一种特殊类型的存储过程,用于在数据库表上自动执行操作。当表上的特定事件(如插入、更新、删除)发生时,触发器会自动触发并执行定义的操作。在编写和调试Oracle触发器时,记录和分析日志非常重要。下面是一些有关Oracle触发器调试日志的技巧。 1. 使用DBMS_OUTPUT.PUT_LINE函数 在Oracle触发器,可以使用DBMS_OUTPUT.PUT_LINE函数输出调试信息。这些信息将显示在PL/SQL工具的输出窗口。以下是一个示例触发器,其使用了DBMS_OUTPUT.PUT_LINE函数。 ```sql CREATE OR REPLACE TRIGGER mytrigger AFTER INSERT ON mytable FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('Insert occurred on mytable'); END; ``` 2. 使用UTL_FILE包写入日志文件 除了将调试信息输出到PL/SQL工具的输出窗口,还可以使用UTL_FILE包将信息写入到文件。以下是一个示例触发器,其使用了UTL_FILE包。 ```sql CREATE OR REPLACE TRIGGER mytrigger AFTER INSERT ON mytable FOR EACH ROW DECLARE v_file UTL_FILE.FILE_TYPE; BEGIN v_file := UTL_FILE.FOPEN('/tmp', 'mylog.log', 'a'); UTL_FILE.PUT_LINE(v_file, 'Insert occurred on mytable'); UTL_FILE.FCLOSE(v_file); END; ``` 该触发器将调试信息写入文件“/tmp/mylog.log”。 3. 使用RAISE_APPLICATION_ERROR函数 在Oracle触发器,可以使用RAISE_APPLICATION_ERROR函数引发应用程序错误,并在日志记录错误信息。以下是一个示例触发器,其使用了RAISE_APPLICATION_ERROR函数。 ```sql CREATE OR REPLACE TRIGGER mytrigger BEFORE INSERT ON mytable FOR EACH ROW BEGIN IF :NEW.column1 IS NULL THEN RAISE_APPLICATION_ERROR(-20001, 'Column1 cannot be null'); END IF; END; ``` 该触发器在插入行之前检查“column1”列是否为NULL。如果是,它将引发应用程序错误,并在日志记录错误信息。 在编写和调试Oracle触发器时,记录和分析日志是非常重要的。可以使用DBMS_OUTPUT.PUT_LINE函数、UTL_FILE包和RAISE_APPLICATION_ERROR函数来记录日志信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值