it-swarm.com.ru

Как использовать DROP TABLE IF EXISTS в хранимой процедуре MySQL

Я хочу знать, как использовать DROP TABLE IF EXISTS в процедуре MySQLstored. Я пишу довольно длинную хранимую процедуру mySQL, которая выполнит кучу работы, а затем загрузит временную таблицу с результатами. Однако у меня возникли проблемы с выполнением этой работы. 

Я видел несколько способов сделать временную таблицу. По сути, вы либо создаете временную таблицу, работаете с ней, а затем удаляете ее в конце ... или вы удаляете ее, если она существует, создаете ее, а затем выполняете свою работу над ней.

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

Вот мои примеры:

Это работает:

DELIMITER//
    DROP PROCEDURE IF EXISTS pTest//
    CREATE PROCEDURE pTest()
    BEGIN
        CREATE TEMPORARY TABLE tblTest (
            OrderDate varchar(200)
        );
        DROP TEMPORARY TABLE tblTest;
    END//
 DELIMITER ;
CALL pTest();

Это работает:

DELIMITER//
    DROP PROCEDURE IF EXISTS pTest//
    CREATE PROCEDURE pTest()
    BEGIN
        DROP TEMPORARY TABLE tblTest;
        CREATE TEMPORARY TABLE tblTest (
            OrderDate varchar(200)
        );
    END//
 DELIMITER ;
CALL pTest();

Это не:

DELIMITER//
    DROP PROCEDURE IF EXISTS pTest//
    CREATE PROCEDURE pTest()
    BEGIN
        DROP TEMPORARY TABLE IF EXISTS tblTest;
        CREATE TEMPORARY TABLE tblTest (
            OrderDate varchar(200)
        );
    END//
 DELIMITER ;
CALL pTest();

Первые 2 работают, но если эта таблица существует (например, если процедура не завершилась или что-то еще), она, очевидно, завершится ошибкой «Table tblTest not Существует». Нерабочий пример - это то, что я ищу - бросьте стол, если он там, а затем воссоздайте его, чтобы я мог начать чистить.

Такое ощущение, что это «ЕСЛИ СУЩЕСТВУЕТ», что делает эту вещь неудачной. Я скопировал код со всех видов сайтов, которые делают вещи очень похожими, и ни в коем случае я не могу заставить работать «DROP TABLE IF EXISTS ...». Когда-либо.

Dev Server: версия сервера MySQL: 5.1.47-communityProd Server: версия сервера MySQL: 5.0.45-log

Мы не можем изменить версии БД (администраторы БД этого не допустят), поэтому я застрял на том, что имею. Это ошибка в MySQL или в процедуре?

Благодарю.

15
Coach John

Это старый вопрос, но он возник, когда я искал DROP TABLE IF EXISTS.

Ваш нерабочий код не работал на моем сервере MySQL 5.1.70.

Все, что мне нужно было сделать, это добавить пробел между DELIMITER и // в первой строке, и все работало нормально.

Рабочий код:

DELIMITER //
    DROP PROCEDURE IF EXISTS pTest//
    CREATE PROCEDURE pTest()
    BEGIN
        DROP TEMPORARY TABLE IF EXISTS tblTest;
        CREATE TEMPORARY TABLE tblTest (
            OrderDate varchar(200)
        );
    END//
DELIMITER ;
16
IvanD

У меня тоже была такая же проблема. Кажется, MySQL не любит проверять, существует ли таблица в некоторых версиях или что-то в этом роде. Я обошел проблему, сначала запросив базу данных, и, если я нашел таблицу, я ее отбросил. Используя PHP:

$q = @mysql_query("SELECT * FROM `$name`");
if ($q){
    $q = mysql_query("DROP TABLE `$name`");
    if(!$q) die('e: Could not drop the table '.mysql_error());
}

Вы подавляете ошибку в первом запросе с помощью символа @, чтобы у вас не было мешающей ошибки, а затем удаляете таблицу, когда запрос возвращает значение false.

2
Abraham Brookes

Я не знаю, почему это не работает для вас, но вы должны быть в состоянии обойти проблему, используя обработчик продолжения. Если вы поместите оператор DROP TABLE в его собственный блок BEGIN...END, вы можете использовать обработчик продолжения, чтобы игнорировать ошибку, если таблица не существует.

Попробуй это:

DELIMITER //
    DROP PROCEDURE IF EXISTS pTest //
    CREATE PROCEDURE pTest()
    BEGIN
      BEGIN
        DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' BEGIN END;
        DROP TEMPORARY TABLE tblTest;
      END;
        CREATE TEMPORARY TABLE tblTest (
            OrderDate varchar(200)
        );
    END //
 DELIMITER ;
CALL pTest();
1
Ike Walker

Я рекомендую добавить новую строку 

SET sql_notes = 0// before DROP PROCEDURE IF EXISTS get_table //

В противном случае будет отображаться предупреждение ПРОЦЕДУРА не существует.

0
user5957221