не может получить данные в переменные из динамического SQL - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь получить имя таблицы динамически (курсор 1), затем пытаюсь извлечь данные из этой таблицы (таблица 1) в переменные, а затем пытаюсь вставить эти переменные в другую таблицу (таблица 2) вместе сИмя таблицы и другие данные, полученные в исходном курсоре 1. Но я обнаружил, что данные, вставленные в таблицу 2, содержат только данные, полученные из курсора 1. Но другие поля, которые должны быть извлечены из таблицы 1, являются пустыми. Это означает, что переменные пусты. Я также создал отладочный sql, который прекрасно работает, когда я удаляю переменные.

Я новичок в написании процедурного SQL. Может ли кто-нибудь, пожалуйста, помогите мне. И это, я считаю, может послужить примером, потому что я не нашел хорошего примера в сети по этому типу проблемы.

Это вывод оператора отладки. Он вернул результат, когда я запустил его отдельно без переменной. Оригинальный фрагмент кода дается после него.

SELECT COUNT(week_of_year),  AVG(naivemape) avgnaive, SUM(original+naive2mape), AVG(f1mape) , AVG(f2mape), AVG(f3mape),AVG(f4mape), AVG(f5mape),STDDEV(f1mape), STDDEV(f2mape), STDDEV(f3mape),STDDEV(f4mape), STDDEV(f5mape) INTO 
                vcountweek,
                vavgnaive,
                vtotal_sale,
                vavgf1mape,
                vavgf2mape,
                vavgf3mape,
                vavgf4mape,
                vavgf5mape,
                vstddevf1mape,
                vstddevf2mape,
                vstddevf3mape,
                vstddevf4mape,
                vstddevf5mape

FROM zdata2_7_Canberra_Mel_2014allout_day_1 WHERE stepserial IN (4)

    DELIMITER $$

    USE `x_data`$$

   DROP PROCEDURE IF EXISTS `create_zdata2_thesis_2014_summary`$$

   CREATE DEFINER=`root`@`localhost` PROCEDURE `create_zdata2_thesis_2014_summary`( )
   BEGIN

    DECLARE no_more_rows BOOLEAN;

    DECLARE vtable_name VARCHAR(500);
    DECLARE vweekday    VARCHAR(1);
    DECLARE vboarding_station_name VARCHAR(100);
    DECLARE vdeboarding_station_name VARCHAR(100);
    DECLARE C1 CURSOR FOR SELECT output_table, RIGHT(output_table,1), boarding_station_name, deboarding_station_name FROM `x_data`.`z_thesis_logtable`;

    DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET no_more_rows = TRUE;


    OPEN c1;
    LOOP1: LOOP
        FETCH c1 INTO vtable_name, vweekday, vboarding_station_name,vdeboarding_station_name ;
        IF no_more_rows THEN
        CLOSE c1;
        LEAVE LOOP1;
        END IF;

        BLOCK1STEP: BEGIN

            DECLARE vcreatestmt VARCHAR(5000);
            DECLARE vweekday INT(4);
            DECLARE vcountweek INT(4);
            DECLARE vstepserial INT(4);


            DECLARE vtotal_sale DECIMAL(41,8);
            DECLARE vavgnaive DECIMAL(22,12);   
            DECLARE vavgf1mape DECIMAL(22,12);
            DECLARE vavgf2mape DECIMAL(22,12);
            DECLARE vavgf3mape DECIMAL(22,12);
            DECLARE vavgf4mape DECIMAL(22,12);
            DECLARE vavgf5mape DECIMAL(22,12);
            DECLARE vstddevf1mape DECIMAL(22,12);
            DECLARE vstddevf2mape DECIMAL(22,12);
            DECLARE vstddevf3mape DECIMAL(22,12);
            DECLARE vstddevf4mape DECIMAL(22,12);
            DECLARE vstddevf5mape DECIMAL(22,12);


            SET vstepserial = 4;                    
            SET vcreatestmt = CONCAT('SELECT COUNT(week_of_year),  AVG(naivemape) avgnaive, SUM(original+naive2mape), AVG(f1mape) , AVG(f2mape), AVG(f3mape),AVG(f4mape), AVG(f5mape),
            STDDEV(f1mape), STDDEV(f2mape), STDDEV(f3mape),STDDEV(f4mape), STDDEV(f5mape) INTO 
            @vcountweek,
            @vavgnaive,
            @vtotal_sale,
            @vavgf1mape,
            @vavgf2mape,
            @vavgf3mape,
            @vavgf4mape,
            @vavgf5mape,
            @vstddevf1mape,
            @vstddevf2mape,
            @vstddevf3mape,
            @vstddevf4mape,
            @vstddevf5mape


            FROM ', vtable_name, ' WHERE stepserial IN (4)');


            SELECT vcreatestmt AS '**debug';

            SET @statement = vcreatestmt;

            PREPARE statement FROM @statement;

            EXECUTE statement;

            DEALLOCATE PREPARE statement;

            INSERT INTO zdata2_thesis_summary VALUES
            (vtable_name, vweekday, vboarding_station_name,vdeboarding_station_name,
            vcountweek,
            vstepserial,
            vavgnaive,
            vtotal_sale,
            vavgf1mape,
            vavgf2mape,
            vavgf3mape,
            vavgf4mape,
            vavgf5mape,
            vstddevf1mape,
            vstddevf2mape,
            vstddevf3mape,
            vstddevf4mape,
            vstddevf5mape);             



            INSERT INTO zdata2_summary_log SELECT vtable_name, vcountweek;



        END BLOCK1STEP;


    END LOOP LOOP1;


    END$$

    DELIMITER ;

1 Ответ

1 голос
/ 05 октября 2019

@ vcountweek

является переменной сеанса , но вы вводите во вторую таблицу zdata2_thesis_summary

vcountweek

Что пусто, потому что вы объявили и не заполнили его.

, поэтому сделайте для всех переменных сеанса

SET vcountweek = @vcountweek; 

, прежде чем вставлять или использовать переменные сеанса напрямую

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...