mysql - 如何在mysql中获取触发器中的过程输入参数

标签 mysql stored-procedures

程序::

CREATE DEFINER=`root`@`localhost` PROCEDURE `apply_Leave_SP`(
    in leavetypeid int ,
    in empid int,
    in reason varchar(100),
    in startdate date,
    in enddate date,
    in startsession int,
    in endsession int,
    in compoffid int,
    in mangerid int

    )
    BEGIN

    declare leavestatus int(10) default 0;
    declare optionalyHolidays int(10) default 0;
    declare listofholidays int(10) default 0;
    declare totalhours int (10) default 0;
    declare hours int (10) default 0;
    declare satsun int (10) default 0;

    declare manger_id int(10) default 0;

      select count(holiday_id) into optionalyHolidays from Parabola.holidays where holiday_type_id=2 and 
                              DATEDIFF(startdate,curdate())>=20;

        select count(*) into listofholidays from Parabola.holidays where date between startdate and enddate;                      

     SELECT 
    COUNT(*) AS total into hours
    FROM 
    (   SELECT ADDDATE(startdate, INTERVAL @i:=@i+1 DAY) AS DAY
        FROM (
            SELECT a.a
            FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
            CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
            CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
        ) a
        JOIN (SELECT @i := -1) r1
        WHERE 
        @i < DATEDIFF(enddate, startdate)

    ) AS dateTable
    WHERE WEEKDAY(dateTable.Day) IN (5,6);

           SELECT  datediff(enddate,startdate) into totalhours; 
           set hours=(totalhours-listofholidays-satsun)*8;
        if(leavetypeid=1)then
         set leavestatus=5;
         else
          set leavestatus=1;
           end if;    

           if(optionalyHolidays>=0) then
           set leavestatus=5;
           end if; 


    insert into leave_applied(leave_type_id,hours,employee_id,
    created_at,updated_at,start_date,end_date,start_date_session,
    end_date_session,reason,
    status,reminder_count,personal_calendar_event_id,system_calendar_event_id)

    values(leavetypeid,hours,empid,curdate(),curdate(),startdate,enddate,
    startsession,endsession,
    reason,leavestatus,1,'sdasdas','sadeew');

    END

触发器::

DELIMITER $$
CREATE TRIGGER insert_trigger
after INSERT ON leave_applied FOR EACH ROW
begin
declare leavestatus int(10) default 0;
declare optionalyHolidays int(10) default 0;
declare paidleave int(10) default 0;    


     insert into leave_actual (leave_applied_id,
     leave_type_id,hours,start_date,
     end_date,created_at,updated_at) values(new.leave_applied_id,new.leave_type_id,
     16,new.start_date,new.end_date,curdate(),curdate()) ;

    select count(holiday_id) into optionalyHolidays from Parabola.holidays where holiday_type_id=2 and
                          DATEDIFF(new.start_date,curdate())>=20;   
   if(new.leave_type_id=1)then
     set leavestatus=5;
     else
      set leavestatus=1;
       end if;    

       if(optionalyHolidays>=0) then
       set leavestatus=5;
       end if;

      insert into leave_approval (leave_applied_id,
     manager_id,status ,created_at,updated_at) values
     (new.leave_applied_id,new.employee_id,leavestatus,curdate(),curdate());

END

给定的代码是存储过程和触发器 SP中有9个输入参数,我想在触发器中获取Mange-rid值,但我无法获取该值,请建议我如何在触发器中获取该manger id值,我们没有列manger_id到leave_applied,请建议我

最佳答案

触发器和存储过程没有直接通信,不可能从触发器主体直接获取存储过程的参数。

但是,我们可以使用mysql variables :

All variables for a given client session are automatically freed when that client exits.

CREATE PROCEDURE `apply_Leave_SP`([...], in mangerid int)
BEGIN
    [...]

    -- set the variable before insert
    set @connection_variable = mangerid;
    insert into leave_applied(leave_type_id,hours,employee_id, [...]

END

之后,您可以在 insert_trigger 中使用 @connection_variable

关于mysql - 如何在mysql中获取触发器中的过程输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38588727/

相关文章:

MySQL - SQLSTATE 值

mysql - 从 mysql 中复制 mysql 数据库?

mysql - 在mysql动态存储过程中,是否需要@var来构建准备好的语句?

mysql - 如果某列中的值重复,则从集合结果中检索一行

mysql - sql从高到低排序

php - 如何使用嵌套循环创建列表

MySQL - 关于某些表的正确方法和性能

MySQL 选择列(如果存在)

c# - 如何在 sql 存储过程中使用 C# 方法

linq-to-sql - 存储过程比 LINQ 查询慢?