Как выполнить цикл в хранимой процедуре MySQL при выполнении запроса к nodeJS - PullRequest
0 голосов
/ 08 мая 2019

Я создаю приложение планировщика, которое позволяет мне добавлять встречи в календарь. Как бы то ни было, я сталкиваюсь с проблемой, когда моя хранимая процедура никогда не зацикливается так, как я хочу, в моем реактивном проекте. Что происходит, код ниже вставляет только один элемент и никогда не зацикливается, если я устанавливаю повторяющееся значение, скажем, 7 (один раз в неделю). У меня есть селектор диапазона дат, чтобы выбрать диапазон, скажем, с 2019-05-05 по 2019-05-30, и повторяющееся число будет означать добавление x количества дней (7 в этом примере) и вставку встречи каждые 7 дней.

Я вызываю маршрут из моего файла JS в реакции, используя axios

      axios.post(`/AddTime/${idValue}/${dayValue}/${startValue}/${endValue}/${timeValue}/${startDate}/${endDate}/${zero}/${zero}/${zero}/${repeat}`)

И который идет к моему роутеру (nodeJS и Koa):

   AdvisingRouter.post('/AddTime/:id/:day/:starttime/:endtime/:timeblock/:startdate/:enddate/:islocked/:takenPlace/:oldAppointment/:repeating', AdvisingController.addTimes, (err) => console.log("routers.js: AdvisingRouter error:", err));

Который затем вызывает фактический запрос:

async addTimes(ctx) {
    console.log("THIS IS IN ADVISING CONTROLLER");
    return new Promise((resolve, reject) => {
    let query = "call repeating (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
    console.log('About to run this query.', query);
        dbConnection.query(
            {
                sql: query,
                values: [ctx.params.id, ctx.params.day, ctx.params.starttime, ctx.params.endtime, ctx.params.timeblock, ctx.params.startdate, ctx.params.enddate, ctx.params.islocked, ctx.params.takenPlace, ctx.params.oldAppointment, ctx.params.repeating]
            }, (error) => {
                if (error) {
                    return reject(error);
                }
            }

        )
    }).catch(err => {
        ctx.body = {
            status: "Failed",
            error: err,
            user: null
        };
    });
}

Запрос определенно работает в MySql:

       DELIMITER //
       CREATE PROCEDURE repeating(
       _id int, _Day varchar(45), _StartTime varchar(45), _EndTime 
       varchar(45), _TimeBlock varchar(45), 
       _startDate date, _endDate date, _islocked tinyint, _takenPlace 
       tinyint, _oldAppointment tinyint, _repeatedNumber int)
       begin
        -- Add into AdvisingTimes and possibly repeat evey so often
        Declare __for int;
        Declare __INCDATE date;
        DECLARE __id int;
        DECLARE __Day varchar(45);
        DECLARE __StartTime varchar(45);
        DECLARE __EndTime varchar(45);
        DECLARE __TimeBlock varchar(45);
        DECLARE __startDate date;
        DECLARE __endDate date;
        DECLARE __islocked tinyint;
        DECLARE __takenPlace tinyint;
        DECLARE __oldAppointment tinyint;
        DECLARE __repeatedNumber int;

        select _id into __id;
        select _Day into __Day;
        select _StartTime into __StartTime;
        select _EndTime into __EndTime;
        select _TimeBlock into __TimeBlock;
        select _startDate into __INCDATE;
        select _endDate into __endDate;
        select _islocked into __islocked;
        select _takenPlace into __takenPlace;
        select _oldAppointment into __oldAppointment;
        select _repeatedNumber into __repeatedNumber;



        IF __repeatedNumber = 0 THEN
            Insert into AT (id, Day, StartTime, EndTime, TimeBlock, startDate, endDate, islocked, takenPlace, oldAppointment)
            values (__id, __Day, __StartTime, __EndTime, __TimeBlock, __startDate, __startDate, __islocked, __takenPlace, 2);
        ELSE
            WHILE __INCDATE <= _endDate DO
                Insert into AT (id, Day, StartTime, EndTime, TimeBlock, startDate, endDate, islocked, takenPlace, oldAppointment)
                values (__id, __Day, __StartTime, __EndTime, __TimeBlock, __INCDATE, __endDate, __islocked, __takenPlace, 4);
                SET __INCDATE = (select DATE_SUB(__INCDATE, INTERVAL -__repeatedNumber DAY));
            END WHILE;
        END IF;

конец // разделитель;

Я попытался сохранить переменные внутри, и это тоже не работает. Он получит значения один раз и отправит их, но затем при повторении сбросит все значения. поэтому вставляется только одна запись, а не зацикливается и вставляется повторяющиеся встречи, которые должны быть в календаре каждые 7 дней (в основном повторяющиеся). Я не знаю, имеет ли это смысл, но когда я использую вышеупомянутый запрос внутри MySQL WorkBench, он работает, он просто не работает, когда я вызываю его из моего приложения реагирования.

...