2010-09-01 9 views
14

Desidero sapere come utilizzare DROP TABLE IF EXISTS in una procedura MySQLstored. Sto scrivendo una stored procedure mySQL piuttosto lunga che farà un sacco di lavoro e quindi caricherà una tabella temporanea con i risultati. Tuttavia, sto avendo problemi a fare questo lavoro.Come utilizzare DROP TABLE SE ESISTE in una stored procedure MySQL

Ho visto alcuni modi per fare la cosa della tabella temporanea. Fondamentalmente, puoi creare la tabella temporanea, lavorarci sopra e poi rilasciarla alla fine ... oppure lasciarla se esiste, crearla e poi lavorarci sopra.

Preferisco il secondo metodo in modo da iniziare sempre a pulire, ed è un controllo integrato dell'esistenza della tabella. Tuttavia, non riesco a farlo funzionare:

qui sono i miei esempi:

questo funziona:

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

funziona:

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

Questo non:

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

Il primo 2 di lavoro, ma se questo tavolo esiste (come se la procedura non ha terminato o qualcosa del genere), che sarà ovviamente termina con un errore "tabella tblTest non esiste". L'esempio non funzionante è quello che sto cercando - rilascia la tabella se è lì e poi ricrearla in modo da poter iniziare a pulire.

Sembra che siano gli "IF EXISTS" a far fallire questa cosa. Ho copiato il codice da tutti i tipi di siti che fanno cose molto simili e in nessun caso posso ottenere un "DROP TABLE SE EXISTS ..." per funzionare. Mai.

Dev Server: mySQL versione server: 5.1.47-comunità Prod Server: mySQL Server versione: 5.0.45-log

Non possiamo cambiare db versioni (DBA non lo permettono), così Sono bloccato su quello che ho. Si tratta di un bug in mySQL o nella procedura?

Grazie.

+0

Probabilmente avrei dovuto inviato l'errore effettivo che ottengo ... [Err] 1064 - Hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a '// DELIMITER; CALL pTest() 'alla riga 7 Semplicemente rimuovendo "IF EXISTS" si elimina l'errore e l'intero proc funziona (a meno che, ovviamente, la tabella non esista;) –

risposta

1

Non so perché questo non funzioni per voi, ma dovreste essere in grado di risolvere il problema usando un gestore di continuità. Se si inserisce l'istruzione DROP TABLE nel proprio blocco BEGIN...END, è possibile utilizzare un gestore di continuità per ignorare l'errore se la tabella non esiste.

Prova questo:

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

L'esecuzione di quell'esatta istruzione mi dà lo stesso errore : [Err] 1064 - Si è verificato un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da usare vicino a '// DELIMITER; CALL pTest() 'alla riga 10 –

2

Ho anche avuto lo stesso problema. Sembra che a MySQL non piaccia controllare se la tabella esista su alcune versioni o qualcosa del genere. Ho risolto il problema interrogando prima il database, e se ho trovato un tavolo l'ho lasciato cadere. Utilizzo di 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()); 
} 

È sopprimere l'errore nella prima query con il simbolo @, in modo da non avere un errore di interferenza, e quindi eliminare la tabella quando la query restituisce false.

16

È una vecchia domanda ma è venuta fuori perché cercavo DROP TABLE SE EXISTS.

Il codice non funzionante non ha funzionato sul mio server MySQL 5.1.70.

Tutto quello che dovevo fare era aggiungere uno spazio tra DELIMITER e // sulla prima riga, e tutto ha funzionato bene.

codice di lavoro:

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 ; 
Problemi correlati