2010-09-01 15 views
14

Quiero saber cómo usar DROP TABLE IF EXISTS en un procedimiento almacenado en MySQL. Estoy escribiendo un procedimiento mySQL almacenado bastante largo que hará un montón de trabajo y luego cargará una tabla temporal con los resultados. Sin embargo, tengo problemas para hacer que esto funcione.Cómo utilizar DROP TABLE IF EXISTS en MySQL Stored Procedure

He visto algunas maneras de hacer lo de la tabla temporal. Básicamente, puede crear la tabla temporal, trabajar en ella y luego soltarla al final ... o la descarta si existe, la crea y luego hace su trabajo en ella.

Prefiero el segundo método para que siempre comience la limpieza, y es un control incorporado para la existencia de la tabla. Sin embargo, me parece que no puede conseguir que funcione:

Éstos son mis ejemplos:

esto funciona:

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(); 

Esto funciona:

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(); 

Esto no:

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(); 

Los primeros 2 funcionan, pero si esa tabla existe (como si el procedimiento no terminó o algo así), obviamente terminará con un error "Table tblTest does not exists". El ejemplo que no funciona es lo que estoy buscando: soltar la tabla si está allí y luego recrearla para poder comenzar a limpiar.

Parece que es el "SI EXISTE" haciendo que esto falle. He copiado código de todo tipo de sitios que hacen cosas muy similares y en ningún caso puedo obtener una "TABLA DE CAÍDA SI EXISTE ..." para que funcione. Nunca.

Dev por el servidor MySQL Server: 05/01/47 en la comunidad Prod Servidor: MySQL Server versión: 5.0.45-Log

No podemos cambiar db versiones (DBA no lo permiten), por lo Estoy atrapado en lo que tengo. ¿Es esto un error en mySQL o en el Procedimiento?

Gracias.

+0

probablemente debería haber publicado el error real que consigo ... [Err] 1064 - Usted tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '// DELIMITER; CALL pTest() 'en la línea 7 Simplemente eliminando el "IF EXISTS" elimina el error y todo el proceso funciona (a menos que, por supuesto, la tabla no exista;) –

Respuesta

1

No sé por qué esto no funciona para usted, pero debería ser capaz de evitar el problema utilizando un controlador de continuación. Si coloca la instrucción DROP TABLE en su propio bloque BEGIN...END, puede usar un controlador continue para ignorar el error si la tabla no existe.

Prueba esto:

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(); 
+0

Ejecutar esa declaración exacta me da el mismo error : [Err] 1064 - Tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '// DELIMITER; LLAME pTest() 'en la línea 10 –

2

También tuve el mismo problema. Parece que a MySQL no le gusta comprobar si la tabla existe en algunas versiones o algo. Intenté solucionar el problema consultando primero la base de datos, y si encontré una tabla, la descarté. Uso de 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()); 
} 

Usted suprimir el error en la primera consulta con el símbolo @, por lo que no tienen un error de interferencia, y luego eliminar la tabla cuando la consulta devuelve falso.

16

Es una vieja pregunta, pero surgió porque estaba buscando DROP TABLE IF EXISTS.

Su código que no funcionaba no funcionaba en mi servidor MySQL 5.1.70.

Todo lo que tenía que hacer era agregar un espacio entre DELIMITER y // en la primera línea, y todo funcionó bien.

código de trabajo:

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 ; 
Cuestiones relacionadas