Я пишу курсор, чтобы перебрать все таблицы в схеме MySQL и получить фактический максимальный размер столбца для каждого столбца. Ниже приведен курсор, который я написал для него. Но я не могу пройти через таблицы и выбрать набор результатов:
DELIMITER //
DROP PROCEDURE IF EXISTS sp_test //
CREATE PROCEDURE sp_test ()
BEGIN
DECLARE exit_loop BOOLEAN;
DECLARE mycol VARCHAR(100);
DECLARE mytab VARCHAR(100);
DECLARE cur1 CURSOR FOR
SELECT column_name,table_name FROM information_Schema.columns where table_schema='TestDB' ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE;
DROP TABLE IF EXISTS temp;
CREATE TEMPORARY TABLE temp ( colsize int, colname varchar(1000));
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO mycol,mytab;
INSERT INTO temp (colname,tabname)
select MAX(OCTET_LENGTH(mycol)),IC.column_name from mytab inner join information_Schema.columns IC on IC.column_name= mycol;
IF exit_loop THEN
CLOSE cur1;
LEAVE read_loop;
END IF;
END LOOP read_loop;
select count(*) from temp;
END;
//
call sp_test
Этот код вызывает ошибку: Таблица TestDB.mytab не существует. Я не могу передать значение, которое я получаю от курсора к переменной, или я использую его неправильно. Если я просто использую select вместо INSERT INTO temp table, я вижу несколько результирующих наборов для каждого цикла. Пожалуйста, исправьте меня, чтобы достичь моего варианта использования.
Спасибо
Как упоминалось в wchiquito, вам нужно использовать подготовленный оператор SQL, который примет оператор ниже в качестве строки и выполнит его. Поскольку во время выполнения инструкции mysql не будет извлекать значение перед его выполнением, нам нужно подготовить динамическую строку и выполнить ее,
SET @toExec := CONCAT('INSERT INTO temp (colname,tabname) select MAX(OCTET_LENGTH(',mycol,')),IC.column_name from ',mytab,' inner join information_Schema.columns IC on IC.column_name= ''',mycol,'''');
PREPARE stmt3 FROM @toExec;
EXECUTE stmt3;
Надеюсь, поможет!