关于mysql下的存储过程的问题

      最近我接触了一本php 与 mysql,老外写的一本书,书中有个tshirtshop网店代码,其中操作数据库的大多用的是mysql存储过程,一开始用phpMyAdmin来执行,后来出现一堆错误,后来去掉了begin,end之后可以正常执行,但要执行存储过程,在phpMyAdmn中不行,而在mysql命令行文本框中就可以。

     接下来又遇到更难的问题,在存储过程中加入预处理语句,更不行了,在mysql命令行文本框下执行同样,下面的运行记录,给大家参考,能否有高手来帮助。

mysql>  CREATE PROCEDURE catalog_get_products_in_category(
    ->   IN inCategoryId INT, IN inShortProductDescriptionLength INT,
    ->   IN inProductsPerPage INT, IN inStartItem INT)
    ->   begin
    ->   SELECT p.product_id, p.name,IF(LENGTH(p.description) <= inShortProductD
escriptionLength, p.description,
    ->    CONCAT(LEFT(p.description, inShortProductDescriptionLength),'...')) AS
 description, p.price, p.discounted_price, p.thumbnail
    ->    FROM product p INNER JOIN product_category pc ON p.product_id = pc.pro
duct_id
    ->    WHERE pc.category_id = inCategoryId
    ->    ORDER BY p.display DESC
    ->    LIMIT inStartItem;inProductsPerPage;
    ->   end$$
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'inSta
rtItem;inProductsPerPage;
  end' at line 10

 

//原本的存储过程语句
EATE PROCEDURE catalog_get_products_in_category(
  IN inCategoryId INT, IN inShortProductDescriptionLength INT,
  IN inProductsPerPage INT, IN inStartItem INT)
BEGIN
  PREPARE statement FROM
   "SELECT p.product_id, p.name,IF(LENGTH(p.description) <= ?, p.description,
   CONCAT(LEFT(p.description, ?),'...')) AS description, p.price, p.discounted_price, p.thumbnail
   FROM product p INNER JOIN product_category pc ON p.product_id = pc.product_id
   WHERE      pc.category_id = ?
   ORDER BY   p.display DESC
   LIMIT      ?, ?";
  SET @p1 = inShortProductDescriptionLength;
  SET @p2 = inShortProductDescriptionLength;
  SET @p3 = inCategoryId;
  SET @p4 = inStartItem;
  SET @p5 = inProductsPerPage;
  EXECUTE statement USING @p1, @p2, @p3, @p4, @p5;
END$$

 

mysql> delimiter $$
mysql> CREATE PROCEDURE catalog_get_products_in_category(
    ->   IN inCategoryId INT, IN inShortProductDescriptionLength INT,
    ->   IN inProductsPerPage INT, IN inStartItem INT)
    -> BEGIN
    ->   PREPARE statement FROM
    ->    "SELECT p.product_id, p.name,IF(LENGTH(p.description) <= ?, p.descript
ion,
    ">    CONCAT(LEFT(p.description, ?),'...')) AS description, p.price, p.disco
unted_price, p.thumbnail
    ">    FROM product p INNER JOIN product_category pc ON p.product_id = pc.pro
duct_id
    ">    WHERE      pc.category_id = ?
    ">    ORDER BY   p.display DESC
    ">    LIMIT      ?, ?";
    ->   SET @p1 = inShortProductDescriptionLength;
    ->   SET @p2 = inShortProductDescriptionLength;
    ->   SET @p3 = inCategoryId;
    ->   SET @p4 = inStartItem;
    ->   SET @p5 = inProductsPerPage;
    ->   EXECUTE statement USING @p1, @p2, @p3, @p4, @p5;
    -> END$$
ERROR 1314 (0A000): PREPARE is not allowed in stored procedures

 

上面有两个存储过程,一个不用预处理语句,一个用了预处理语句,

之后,向作者发过邮件,没有答复,又给mysql官方发过邮件,同样没答复。现今只能求助诸位高人。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值