MySQL возвращает набор результатов из запроса выбора в цикле - PullRequest
0 голосов
/ 07 июня 2019

Я не эксперт хранимой процедуры mysql.Мне нужно вернуть набор результатов из запроса.Но если я вызываю эту процедуру, у меня есть только строка, и кажется, что сохраненный вызывается n раз.Вместо этого я хочу только хранимую процедуру вызова с множеством строк в выводе.

Это сохраненный, см. Комментарии, чтобы лучше понять мою цель

     DELIMITER //

    DROP PROCEDURE IF EXISTS getExAnte //

    CREATE PROCEDURE 
      getExAnte(startDate DateTime , stopDate DateTime)
    BEGIN  
        DECLARE id INT ;
        DECLARE instrumental TINYINT ;
        DECLARE done BOOLEAN DEFAULT FALSE;
        DECLARE health_care_cursor CURSOR FOR SELECT h.id,h.instrumental FROM health_cares h inner join health_care_health_care_types hht on h.id=hht.health_care_id;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        OPEN health_care_cursor;

     get_health_cares_loop: LOOP

            IF done THEN
                LEAVE get_health_cares_loop;
            END IF;

     FETCH health_care_cursor INTO id,instrumental;

     ############## I NEED TO ADD THIS QUERY RESULT TO SOME ARRAY OR CURSOR... HOW ?

       SELECT distinct 
        count(*) as numTotPren ,
        sum(case when appointment_date=availability_date then 1 else 0 end) as numTotPrenCheck,
        sum(case when (appointment_date=availability_date AND urgency = 'B') then 1 else 0 end) as numB, 
        sum(case when (appointment_date=availability_date AND urgency = 'B' AND DATEDIFF(availability_date, contact_date) <= 10) then 1 else 0 end) as numBinTime,
        sum(case when (appointment_date=availability_date AND urgency = 'D') then 1 else 0 end) as numD,
        sum(case when (appointment_date=availability_date AND urgency = 'D' AND DATEDIFF(availability_date, contact_date) <= 30) then 1 else 0 end) as numDinTime 

        FROM cup_reservations 
    where 
        contact_date >=startDate and 
        contact_date <stopDate and 
        obsolete IS NULL and 
        health_care_code in (SELECT t.catalog_code FROM health_care_types t inner join health_care_health_care_types ht on t.id=ht.health_care_type_id where ht.health_care_id=id )

       ;  

       END LOOP get_health_cares_loop;

        CLOSE health_care_cursor;
### NOW I NEED A RESULT SET OF ROWS TO RETURN 

    END 
    //

    DELIMITER ;

1 Ответ

0 голосов
/ 11 июня 2019

В MySQL нет переменных-массивов, но вы можете использовать временную таблицу для хранения частичных результатов, сделать обычный запрос и использовать его как «результат»

    DELIMITER //

    DROP PROCEDURE IF EXISTS getExAnte //

    CREATE PROCEDURE 
      getExAnte(startDate DateTime , stopDate DateTime)
    BEGIN  
    DECLARE id INT ;
        DECLARE instrumental TINYINT ;
        DECLARE done BOOLEAN DEFAULT FALSE;
        DECLARE health_care_cursor CURSOR FOR SELECT h.id,h.instrumental FROM health_cares h inner join health_care_health_care_types hht on h.id=hht.health_care_id;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        OPEN health_care_cursor;

        /*1: CREATE TEMPORARY TABLE*/
        DROP TEMPORARY TABLE IF EXISTS results_table;  
        CREATE TEMPORARY TABLE results_table(
            numTotPren int,
            numTotPrenCheck int,
            numB int,
            numBinTime int,
            numD int,
            numDinTime int
        );


    get_health_cares_loop: LOOP

            IF done THEN
                LEAVE get_health_cares_loop;
            END IF;

     FETCH health_care_cursor INTO id,instrumental;

       /*2: SAVE YOUR RESULTS IN TEMPORARY TABLE */
       INSERT INTO results_table (numTotPren,numTotPrenCheck,numB,numBinTime,numD,numDinTime)
       SELECT distinct 
        count(*) as numTotPren ,
        sum(case when appointment_date=availability_date then 1 else 0 end) as numTotPrenCheck,
        sum(case when (appointment_date=availability_date AND urgency = 'B') then 1 else 0 end) as numB, 
        sum(case when (appointment_date=availability_date AND urgency = 'B' AND DATEDIFF(availability_date, contact_date) <= 10) then 1 else 0 end) as numBinTime,
        sum(case when (appointment_date=availability_date AND urgency = 'D') then 1 else 0 end) as numD,
        sum(case when (appointment_date=availability_date AND urgency = 'D' AND DATEDIFF(availability_date, contact_date) <= 30) then 1 else 0 end) as numDinTime 

        FROM cup_reservations 
        WHERE
           contact_date >=startDate and 
           contact_date <stopDate and 
           obsolete IS NULL and 
           health_care_code in (SELECT t.catalog_code FROM health_care_types t inner join health_care_health_care_types ht on t.id=ht.health_care_type_id where ht.health_care_id=id )

       ;  

   END LOOP get_health_cares_loop;

   CLOSE health_care_cursor;

   /*3: FINALLY RUN A REGULAR QUERY */
   SELECT * FROM results_table;

   END 
   //

   DELIMITER ;
...