我在另一个调用存储过程时遇到困难

时间:2019-09-16 18:20:29

标签: mysql sql mysql-workbench

我想在另一个过程中调用存储过程,但是语法似乎不正确。

我试图直接跳过该过程,直接执行select命令,但这似乎不起作用,而且我想知道如何做到这一点。

DELIMITER //
create procedure Find_Eid(Pid int)
    select EId from Employees inner join Patient on EId = EId_fk where Patient.PId = Pid;
//
DELIMITER ;
call Find_Eid(4);
drop procedure Fill_Interact;
DELIMITER //
create procedure Fill_Interact()
begin
    declare N1 int;
    declare TOT date;
    declare Rid int;
    declare Pid int;
    declare Eid int;  
    set N1 = (select count(*) from Patient);
    set TOT = curdate();
    set Rid = 1;
    set Pid = 1;
    while N1 > 0 do
        set Eid = (call Find_Eid(Pid));
        insert into Interact
        (Time_Of_Treatment, RId_fk, PId_fk, EId_fk)
        values
        (TOT,Rid,Pid, Eid);
        if Rid = (select count(*) from Room limit 1) then
                set Rid = 1;
                set TOT = TOT + 1;
        else
                set Rid = Rid + 1;
        end if;
        set N1 = N1 - 1;
        set Pid = Pid + 1;
    end while;
end;
//
DELIMITER ;
call Fill_Interact();

select * from Interact;

1 个答案:

答案 0 :(得分:1)

如果要将过程值分配给另一个变量,则必须在proc中使用out参数。因此,您的第一个过程应该是-

DELIMITER //
create procedure Find_Eid(in Pid int, out eid int)
    select EId into eid
    from Employees
    inner join Patient on EId = EId_fk
    where Patient.PId = Pid;
//

然后您可以在第二个过程中使用此proc-

drop procedure Fill_Interact;
DELIMITER //
create procedure Fill_Interact()
begin
    declare N1 int;
    declare TOT date;
    declare Rid int;
    declare Pid int;
    declare Eid int;  
    set N1 = (select count(*) from Patient);
    set TOT = curdate();
    set Rid = 1;
    set Pid = 1;
    while N1 > 0 do
        call Find_Eid(Pid, Eid);
        insert into Interact
        (Time_Of_Treatment, RId_fk, PId_fk, EId_fk)
        values
        (TOT,Rid,Pid, Eid);
        if Rid = (select count(*) from Room) then
                set Rid = 1;
                set TOT = TOT + 1;
        else
                set Rid = Rid + 1;
        end if;
        set N1 = N1 - 1;
        set Pid = Pid + 1;
    end while;
end;
//
DELIMITER ;
call Fill_Interact();