2013-03-23 97 views
0

我试图在PHPmyadmin中创建一个存储过程,但它似乎并不像我的IF语句。任何人都可以请帮我鉴定一下我做错了:用IF语句创建SQL存储过程

SQL:

CREATE PROCEDURE get_products_in_category(IN inCategoryID INT, 
IN inShortDescriptionLength INT, IN inProductsPerPage INT, IN inStartItem INT) 

BEGIN 
"SELECT p.productID, p.name, IF(LENGTH(p.description) <= ?, p.description, 
CONCAT(LEFT(p.description, ?), '...')) AS description, p.price, p.discounted_price, 
p.thumbnail FROM tblProducts p 

INNER JOIN tblProdCat pc 
ON pc.productID = p.productID 
WHERE tblProdCat.categoryID = ? 
ORDER BY p.display DESC 
LIMIT ?, ?"; 

SET @p1 = inShortDescriptionLength; 
SET @p2 = inShortDescriptionLength; 
SET @p3 = inCategoryID; 
SET @p4 = inStartItem; 
SET @p5 = inProductsPerPage; 

END$$ 

我收到以下错误我:

您的SQL语法错误; 'SELECT p.productID,p.name,IF(LENGTH(p.description)< =?, p.description,CONCA'at the manual syntax, 对应于您的MySQL服务器版本的正确语法在接近''的地方使用 3号线

+0

因为我是个白痴:) – useyourillusiontoo 2013-03-23 15:04:04

回答

0

我想你想执行动态SQL

DELIMITER $$ 
CREATE PROCEDURE get_products_in_category 
(
    IN inCategoryID INT, 
    IN inShortDescriptionLength INT, 
    IN inProductsPerPage INT, 
    IN inStartItem INT 
) 
BEGIN 

    SET @sql = CONCAT('SELECT p.productID, 
           p.name, 
           IF(CHAR_LENGTH(p.description) <= ?, p.description, CONCAT(LEFT(p.description, ?), ''...'')) AS description, 
           p.price, 
           p.discounted_price, 
           p.thumbnail 
         FROM tblProducts p 
           INNER JOIN tblProdCat pc 
            ON pc.productID = p.productID 
         WHERE pc.categoryID = ? 
         ORDER BY p.display DESC 
         LIMIT ',inStartItem, ', ',inProductsPerPage); 



    PREPARE stmt1 FROM @sql; 
    SET @p1 = inShortDescriptionLength; 
    SET @p2 = inShortDescriptionLength; 
    SET @p3 = inCategoryID; 

    EXECUTE stmt1 USING @p1, @p2, @p3; 
    DEALLOCATE PREPARE stmt1; 
END $$ 
DELIMITER ;