Я пытаюсь получить имя таблицы динамически (курсор 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 ;