Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带循环的存储过程中的mySql动态SQL_Mysql_Informix - Fatal编程技术网

带循环的存储过程中的mySql动态SQL

带循环的存储过程中的mySql动态SQL,mysql,informix,Mysql,Informix,以下是为Informix编写的存储过程。我想把它翻译成MySQL。我已经计算了IN,out变量,但是我很难找到错误处理的方法,尽管目前这不是一个很大的问题。接下来是一个存储过程调用,它返回三个参数。我想知道这在MySQL中是否可能?最后,我想从结果中构建一个查询,循环遍历结果,并在第一次迭代后退出 程序从这里开始 CREATE PROCEDURE "informix".elite_ctrl_date(p_game_code CHAR(10)) RETURNING DATE,I

以下是为Informix编写的存储过程。我想把它翻译成MySQL。我已经计算了IN,out变量,但是我很难找到错误处理的方法,尽管目前这不是一个很大的问题。接下来是一个存储过程调用,它返回三个参数。我想知道这在MySQL中是否可能?最后,我想从结果中构建一个查询,循环遍历结果,并在第一次迭代后退出

程序从这里开始

CREATE PROCEDURE  "informix".elite_ctrl_date(p_game_code CHAR(10))         
RETURNING DATE,INTEGER,INTEGER,INTEGER,INTEGER,CHAR(1);`    

-- Return Vars
DEFINE  l_date                  DATE;
DEFINE  l_week                  INTEGER;
DEFINE  l_event                 INTEGER;
DEFINE  l_min_event             INTEGER;
DEFINE  l_max_event             INTEGER;
DEFINE  l_dayname               CHAR(3);
DEFINE  l_open                  CHAR(1);

-- Get Current Vars
DEFINE  l_week_now              INTEGER;
DEFINE  l_today                 DATE;
DEFINE  l_now                   DATETIME HOUR TO MINUTE;
DEFINE  l_datetime              DATETIME YEAR TO SECOND;
DEFINE  l_first_score           DATE;
DEFINE  l_dt_first              DATETIME YEAR TO SECOND;


-- Errorlog Stuff
DEFINE  l_return                INTEGER;
DEFINE  l_SQL_error             INTEGER;
DEFINE  l_ISM_error             INTEGER;
DEFINE  l_error_data            CHAR(200);
DEFINE  l_error                 CHAR(300);

ON EXCEPTION SET l_SQL_error, l_ISM_error, l_error_data
    LET l_error = "SQL: " || l_SQL_error || " ISAM: " || l_ISM_error || " Data: " || l_error_data;
    CALL create_errlog( p_game_code,
                        133,        --PV_erl_errno
                        0,          --PV_erl_manager_pin
                        0,          --PV_erl_team_pin
                        l_error,    --PV_erl_notes
                        "Y"         --PV_report
                    )
        RETURNING l_return;
    RETURN "01/01/1980",-133,-133,-133,-133, "N";
END EXCEPTION;

SET ISOLATION TO DIRTY READ;

LET l_first_score   = NULL;
LET l_dt_first      = NULL;
LET l_open          = "N";
LET l_min_event     = -99;

SELECT  DATE(first_score), EXTEND(first_score, YEAR TO SECOND)
INTO    l_first_score, l_dt_first
FROM    game_config
WHERE   game_code = p_game_code;

CALL get_current() RETURNING l_today, l_now, l_datetime;

IF l_first_score IS NOT NULL
    AND l_today < l_first_score
THEN
    LET l_today     = l_first_score;
    LET l_now       = "00:00";
    LET l_datetime  = l_dt_first;
END IF

SELECT  weekno
INTO    l_week_now
FROM    calendar
WHERE   date = l_today;

IF week_now IS NULL
THEN
    LET week_now = -164;
END IF

FOREACH
    SELECT  date,weekno,event,dayname
    INTO    l_date,l_week,l_event,l_dayname
    FROM    event a,calendar b
    WHERE   a.abs_dayno   = b.abs_dayno
    AND     a.date        = l_today
    AND     a.start      >= l_now
    AND     b.weekno     NOT IN (SELECT week FROM international)
    AND     b.weekno     NOT IN (SELECT weekno FROM nonscore_week)
    AND     b.day IN ('Sat','Sun')
    UNION
    SELECT  date,weekno,event,dayname
    FROM    event a,calendar b
    WHERE   a.abs_dayno   = b.dia_abs_dayno
    AND     a.date        > l_today
    AND     b.weekno     NOT IN (SELECT week FROM international)
    AND     b.weekno     NOT IN (SELECT weekno FROM nonscore_week)
    AND     b.day IN ('Sat','Sun')
    UNION
    SELECT  TODAY,9999,9999,"N/A"
    FROM    event,calendar
    WHERE   a.abs_dayno   = b.abs_dayno
    AND     a.event       = (SELECT MAX(event) FROM event)
    AND     b.weekno     NOT IN (SELECT week FROM international)
    AND     b.weekno     NOT IN (SELECT weekno FROM nonscore_week)
    ORDER BY 3

    IF l_event = 9999
    THEN
        LET l_date      = TODAY;
        LET l_week      = -164;
        LET l_event     = -164;
        LET l_max_event = -164;
    END IF

    IF l_week != -164
    THEN
        SELECT  MIN(event)
        INTO    l_min_event
        FROM    event
        WHERE   weekno = l_week
        AND     dayname IN ('Sat','Sun');
    END IF

    IF l_min_event < l_event
    THEN
        CONTINUE FOREACH;
    END IF

    IF l_week != -164
    THEN
        SELECT  MAX(event)
        INTO    l_max_event
        FROM    event
        WHERE   weekno = l_week
        AND     dayname IN ('Sat','Sun');
    END IF

    EXIT FOREACH;

END FOREACH;

SELECT  MIN(event)
INTO    l_min_event
FROM    stan_calendar a, game_event b
WHERE   a.weekno = l_week
AND     a.date = b.date
AND     a.day IN ('Sat','Sun');

IF l_min_event = l_event
THEN
    LET l_open = "Y";
END IF

RETURN l_date,l_week,l_event,l_max_event,l_week_now,l_open;

END PROCEDURE;
但我知道它不在这里,因为当我把它注释掉时,错误会移动。如果我在这之前把一切都说出来。评论就在开头

有什么想法吗


非常感谢。

DEFINE
在MySQL和DB2中是
DECLARE
,我认为在SQL标准中也是如此<代码>今天可以转换为日期(当前日期)。但是我不确定整个存储过程是否可以翻译成MySQL。
CREATE PROCEDURE `control_date`(in p_game_code char(10),out outDate date, out outWeek int, out outWeekNow int, out outOpen char(1))
BEGIN
DECLARE ld_first    DATE;
DECLARE ldt_first   DATETIME;

DECLARE l_date      DATE;
DECLARE l_time      TIME;
DECLARE l_dtime     DATETIME;

DECLARE l_done      INT;

DECLARE procDate    DATE;
DECLARE procTime    TIME;
DECLARE procWeekNo  INT;

DECLARE noMoreWeeks INT(4);

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SET outOpen = "N";

SELECT DATE(game_start), game_start
INTO ld_first , ldt_first 
FROM gameConfig
WHERE game_code = p_game_code;

SELECT date, time, datetime
INTO l_date , l_time , l_dtime 
FROM time
WHERE 1 = 1;

if (l_date is null)
or (l_time is null)
or (l_dtime is null)
then
    set l_date = now();
    set l_time = now();
    set l_dtime = now();
end if;

if ((ld_first is null)
and (l_date < ld_first))
then
    set l_date = ld_first;
    set l_time = "00:00:00";
    set l_dtime = ldt_first;
end if;

SELECT week_number
INTO outWeekNow 
FROM week_config
WHERE l_date BETWEEN start_date AND end_date;

if outWeekNow IS NULL
then
    SET outWeekNow = -1;
end if;

DECLARE curs1 CURSOR FOR 
    SELECT fixture_date, fixture_time, week_number 
    FROM fixture WHERE fixture_date = l_date
    AND fixture_time >= l_time
    UNION 
    SELECT fixture_date, fixture_time, week_number 
    FROM fixture WHERE fixture_date > l_date 
    UNION 
    SELECT curdate(), curtime(), 9999 
    FROM fixture 
    ORDER BY 3,1,2;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET noMoreWeeks = TRUE;

loopQuery: LOOP
    set l_done = 0;

    open dayCurs;
    fetch dayCurs into procDate, procTime, procWeekNo USING l_date, l_time, l_date;

    if l_done
    then
        LEAVE loopQuery;
    end if;

    if procWeekNo = 9999
    then
        SET procDate = curdate();
        SET procWeekNo = -1;
    end if;

    LEAVE loopQuery;
END LOOP;

if procDate => l_date
then
    if procDate > l_date
    then
        set outOpen = "Y";
    else
        if procTime > l_time
        then
            set outOpen = "Y";
        end if;
    end if;
end if;

set outDate = procDate;
set outWeek = procWeekNo; 
END
if outWeekNow IS NULL
then
SET outWeekNow = -1;
end if;