Ошибка хранимой процедуры на CALL - PullRequest
3 голосов
/ 27 сентября 2011

Я пытаюсь вызвать процедуру, которая успешно компилируется, но при вызове я получаю эту ошибку:

Запрос: вызов proc5

Код ошибки: 1064 У вас есть ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'NULL' в строке 1

Это моя хранимая процедура:

DELIMITER $$

CREATE DEFINER = `root` @`localhost` PROCEDURE `proc5` () 
BEGIN
  DECLARE done BOOL DEFAULT FALSE ;
  DECLARE tablename VARCHAR (100) ;
  DECLARE tracktables CURSOR FOR 
  SELECT 
    TABLE_NAME 
  FROM
    information_schema.TABLES 
  WHERE TABLE_SCHEMA = 'db1' ;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE ;
  OPEN tracktables ;
  myloop :
  LOOP
    FETCH tracktables INTO tablename ;
    IF done 
    THEN CLOSE tracktables ;
    LEAVE myloop ;
    END IF ;
    SET @s = CONCAT(
      'INSERT INTO db2.test1 SELECT * FROM ',
      @tablename
    ) ;
    PREPARE stmt1 FROM @s ;
    EXECUTE stmt1 ;
    DEALLOCATE PREPARE stmt1 ;
  END LOOP ;
END $$

DELIMITER ;

Собственно, я хочу выбратьвсе таблицы из базы данных и вставьте эти таблицы в одну таблицу, которая находится в другой базе данных, используя MySQL Cursors.И когда я вызываю эту хранимую процедуру, я получаю вышеуказанную ошибку.

1 Ответ

3 голосов
/ 28 сентября 2011

Проблема в том, что вы смешиваете объявленные переменные и impromtu @ vars.

var -> tablename не равно var -> @tablename.

Измените строку установки:

SET @s = CONCAT(
  'INSERT INTO db2.test1 SELECT * FROM `'
  ,tablename
  ,'`'
) ;

Теперь это должно работать.

Обратные знаки ` не нужны, но есть на всякий случай.

...