2011-11-01 20 views
0

我試圖寫在phpMyAdmin一個存儲過程,但我得到這個錯誤,我也做到了在Navicat,但我得到了同樣的錯誤,有人可以幫我解決呢?,幫助非常感激感謝我該如何解決這個sp在phpmyadmin?

# 1064 - 你的SQL語法錯誤;在第2行

檢查對應於你的MySQL服務器版本使用附近的正確語法手冊「IN comienzo INT,IN termino INT)BEGIN SELECT usuario.nombre,LEF」這是我的存儲過程:

CREATE PROCEDURE store(
    IN actualUser varchar(20) 
) 

SET @comienzo2 = comienzo; 
SET @termino2 = termino; 
SET @actualUser2 = actualUser; 

BEGIN 
SELECT 
usuario.nombre, 
LEFT(titulo, 20) as titulo, 
LEFT(mensaje, 20) as mensaje, 
correo.fecha, 
correo.id_correo, 
correo_has_usuario.correo_id_correo, 
correo_has_usuario.destinatario_id_usuario, 
correo_has_usuario.eliminado, 
correo_has_usuario.leido 
FROM 
correo_has_usuario 
Inner Join correo ON correo_has_usuario.correo_id_correo = 
correo.id_correo 
Inner Join usuario ON usuario.id_usuario = 
correo.usuario_id_usuario 
WHERE 
correo_has_usuario.destinatario_id_usuario = actualUser AND 
correo_has_usuario.eliminado = 0 ORDER BY correo.fecha DESC 
LIMIT comienzo,termino; 
END$$ 

再次感謝您的回答我收到此錯誤消息#1064 - 您的SQL語法錯誤;檢查對應於你的MySQL服務器版本的手冊,在'SET @ termino2 = termino;'附近使用正確的語法。 SET @ actualUser2 = actualUser;開始於行8

+0

你沒有使用'DELIMITER'定界符改爲''$$。 –

回答

1

你已經錯過了的數據長度關VARCHAR的第2行

IN actualUser varchar(20)例如

PREPARE語句'

你的極限說法也是不正確的,並會拋出一個錯誤。在存儲過程中使用時,限制必須是數字或局部變量。見

http://dev.mysql.com/doc/refman/5.5/en/select.html

存儲程序中,LIMIT參數可以通過 整數值的常規參數或局部變量的MySQL 5.5.6 的規定。

要做到這一點你必須設置你的參數作爲變量,如

SET @comienzo2 = comienzo; 
SET @termino2 = termino; 
SET @actualUser2 = actualUser; 

然後,而不是簡單地運行你的SELECT語句必須準備好它,然後執行它。

PREPARE stmt FROM 'SELECT ... LIMIT ?, ?'; 
EXECUTE stmt USING @comienzo2, @termino2; 
DEALLOCATE PREPARE stmt; 

這也將是你的where語句的情況。

例子:

DELIMITER $$ 
CREATE PROCEDURE store(
    IN actualUser varchar(20), 
    IN comienzo int, 
    IN termino int 
) 

SET @comienzo2 := comienzo; 
SET @termino2 := termino; 
SET @actualUser2 := actualUser; 

BEGIN 
PREPARE stmt FROM 'SELECT 
    usuario.nombre, 
    LEFT(titulo, 20) as titulo, 
    LEFT(mensaje, 20) as mensaje, 
    correo.fecha, 
    correo.id_correo, 
    correo_has_usuario.correo_id_correo, 
    correo_has_usuario.destinatario_id_usuario, 
    correo_has_usuario.eliminado, 
    correo_has_usuario.leido 
    FROM 
    correo_has_usuario 
    Inner Join correo ON correo_has_usuario.correo_id_correo = 
    correo.id_correo 
    Inner Join usuario ON usuario.id_usuario = 
    correo.usuario_id_usuario 
    WHERE 
    correo_has_usuario.destinatario_id_usuario = ? AND 
    correo_has_usuario.eliminado = 0 ORDER BY correo.fecha DESC 
    LIMIT ?,?;' 
EXECUTE stmt USING @actualUser2, @comienzo2, @termino2; 
DEALLOCATE PREPARE stmt; 
END; 
$$ 
+0

那麼如何在商店程序中定義限制?我不明白如果我需要通過一個限制,你能解釋一點點嗎?感謝您的回答 – bentham

+0

我更新我的答案與mi問題,我仍然沒有得到它在navicat或phpmyadmin工作,我也編輯標籤我使用PHP和pdo – bentham

+0

對不起,如果我的答案是誤導。我用一個沒有語法錯誤的例子更新了它,但是我沒有測試它,因爲我沒有數據庫結構。 –