2013-01-06 21 views
5

Nel seguente stored procedure che ha rilevato un errore:MySql stored procedure else if e le query multiple

DROP PROCEDURE IF EXISTS `SP_DeleteFileInfo`; 
CREATE PROCEDURE `SP_DeleteFileInfo`(pFileID int) 
Set @FileRef= null; 
select filesinfo.ReferenceID into @FileRef FROM filesinfo where filesinfo.FileID =pFileID; 
DELETE From filesinfo 
WHERE filesinfo.FileID= pFileID; 
IF EXISTS(SELECT * from filesrefrences where filesrefrences.ReferenceID= @FileRef and filesrefrences.RefrenceCount>1) then 
    update filesrefrences 
    set 
     filesrefrences.RefrenceCount= filesrefrences.RefrenceCount-1 
    where 
     filesrefrences.ReferenceID= @FileRef; 
    SELECT @FileRef; 
ELSE IF(@FileRef is Not NULL) THEN 
    DELETE from filesrefrences WHERE filesrefrences.ReferenceID = @FileRef; 
    SELECT -77; 
ELSE 
    SELECT -99; 
end if; 

L'errore riscontrato è:

[SQL] 
select filesinfo.ReferenceID into @FileRef FROM filesinfo where filesinfo.FileID =pFileID; 
[Err] 1054 - **Unknown column 'pFileID' in 'where clause'** 

Quale sarebbe la soluzione migliore per risolvere questo errore?

risposta

0

ho dovuto aggiungere un ulteriore "End IF" per coprire "else if" dichiarazione la domanda completa è la seguente:

CREATE PROCEDURE `SP_DeleteFileInfo`(IN pFileID int) 
BEGIN  
Set @FileRef= null; 
    select filesinfo.ReferenceID into @FileRef FROM filesinfo where filesinfo.FileID =pFileID; 
    DELETE From filesinfo WHERE filesinfo.FileID= pFileID; 
    IF EXISTS(SELECT * from filesrefrences where filesrefrences.ReferenceID= @FileRef and filesrefrences.RefrenceCount>1) then 
     update filesrefrences 
     set filesrefrences.RefrenceCount= filesrefrences.RefrenceCount-1 
     where filesrefrences.ReferenceID= @FileRef; 
     SELECT @FileRef; 
    ELSE IF(@FileRef is Not NULL) THEN 
     DELETE from filesrefrences WHERE filesrefrences.ReferenceID = @FileRef; 
     SELECT -77; 
    ELSE 
     SELECT -99; 
    end if; 
end if; 
END; 
+1

non ci dovrebbe essere spazio tra ELSE IF in realtà dovrebbe essere ELSEIF (@FileRef non è null) THEN – Riz

8

definire pFileID come IN parametro, per esempio

CREATE PROCEDURE SP_DeleteFileInfo(IN pFileID int) 

query full,

DROP PROCEDURE IF EXISTS `SP_DeleteFileInfo`; 
DELIMITER // 
CREATE PROCEDURE `SP_DeleteFileInfo`(IN pFileID int) 
BEGIN 
    Set @FileRef= null; 
    select filesinfo.ReferenceID into @FileRef FROM filesinfo where filesinfo.FileID =pFileID; 
    DELETE From filesinfo WHERE filesinfo.FileID= pFileID; 
    IF EXISTS(SELECT * from filesrefrences where filesrefrences.ReferenceID= @FileRef and filesrefrences.RefrenceCount>1) then 
     update filesrefrences 
     set filesrefrences.RefrenceCount= filesrefrences.RefrenceCount-1 
     where filesrefrences.ReferenceID= @FileRef; 
     SELECT @FileRef; 
    ELSE 
     IF(@FileRef is Not NULL) THEN 
      DELETE from filesrefrences WHERE filesrefrences.ReferenceID = @FileRef; 
      SELECT -77; 
     ELSE 
      SELECT -99; 
     END IF; 
    END IF; 
END // 
DELIMITER ; 
+0

Sì, ma devo ancora affrontare lo stesso problema. devo aggiungere ** clausole begin/end **? se si ? come potrei fare per coprire le Queries in SP - user1915102 25 secondi fa edit –

+1

vedere la mia risposta aggiornata, è necessario aggiungere 'BEGIN/END' e cambiare il' DELIMITER' –

+0

Vedo, ma ora devo affrontare questo errore " Hai un errore nella sintassi SQL, controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino a '&& DELIMITER' alla riga 17 " –

0

Hai più di un errore di sintassi

DROP PROCEDURE IF EXISTS `SP_DeleteFileInfo`; 
-- MISSING DELIMITER // 
CREATE PROCEDURE `SP_DeleteFileInfo`(pFileID int) 
-- MISSING BEGIN 
    Set @FileRef= null; 
    select filesinfo.ReferenceID into @FileRef FROM filesinfo where filesinfo.FileID =pFileID; 
    DELETE From filesinfo 
    WHERE filesinfo.FileID= pFileID; 
    IF 
    EXISTS(SELECT * from filesrefrences where filesrefrences.ReferenceID= @FileRef and filesrefrences.RefrenceCount>1) 
    then 
    update filesrefrences 
    set 
     filesrefrences.RefrenceCount= filesrefrences.RefrenceCount-1 
    where 
     filesrefrences.ReferenceID= @FileRef; 
    SELECT @FileRef; 
    ELSE 
    IF 
     (@FileRef is Not NULL) 
    THEN 
     DELETE from filesrefrences WHERE filesrefrences.ReferenceID = @FileRef; 
     SELECT -77; 
    ELSE 
     SELECT -99; 
    end if; 
-- MISSING END IF; 
-- MISSING END// 
-- MISSING DELIMITER ; 

E si ottiene questo errore

[SQL] select filesinfo.ReferenceID into @FileRef FROM filesinfo where filesinfo.FileID =pFileID; [Err] 1054 - Unknown column 'pFileID' in 'where clause'

perché la stored procedure si crea è questa

CREATE PROCEDURE `SP_DeleteFileInfo`(pFileID int) 
Set @FileRef= null; 

Tutte le altre affermazioni sono normali dichiarazioni singole e quindi pFileID è sconosciuto a questo contesto.

Basta provare questa istruzione select autonomamente e si otterrà lo stesso errore.

select filesinfo.ReferenceID into @FileRef FROM filesinfo where filesinfo.FileID =pFileID;