MySQL Cursor не может выбрать переменную извлечения

0

Я пишу курсор, чтобы перебрать все таблицы в схеме 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, я вижу несколько результирующих наборов для каждого цикла. Пожалуйста, исправьте меня, чтобы достичь моего варианта использования.

Спасибо

  • 0
    выберите MAX (OCTET_LENGTH (mycol)), IC.column_name из внутреннего соединения mytab information_Schema.columns IC на IC.column_name = mycol; Проверьте таблицу mytab, существует ли она в вашей базе данных?
  • 0
    Нет, это не имя таблицы. это переменная выборки, которую я использую для загрузки всех имен таблиц в моей базе данных MYSQL: FETCH cur1 INTO mycol, mytab;
Показать ещё 4 комментария
Теги:
mysql-workbench

1 ответ

1
Лучший ответ

Как упоминалось в 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;

Надеюсь, поможет!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню