2016-07-16 71 views
0

我写的代码为mysql存储过程它显示语法错误我不知道我做了什么错误。任何人都请帮助我。mysql语法错误,同时设置存储过程参数

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `aad_adr`.` PROCEDURE MonthlySalesReport(fromdate DATE,todate DATE)` $$ 
CREATE PROCEDURE `aad_adr`.` PROCEDURE MonthlySalesReport(fromdate DATE,todate DATE)`() 
BEGIN 
Declare fd DATE; 
Declare ed DATE; 
SET fd=fromdate; 
SET ed=todate; 
WHILE DATE(fd)<=DATE(ed)DO 
select bill_master.bill_no,DATE_FORMAT(bill_master.bill_date, '%y/%m/%d') AS 'formatted_date',transaction.product_id,transaction.tax_amount,transaction.amount,transaction.amount-transaction.tax_amount as 'without_tax ',product_master.Product_name,product_master.vat from bill_master inner join transaction on bill_master.bill_no=transaction.bill_no inner join product_master on transaction.product_id=product_master.product_id where vat='14.50' and DATE_FORMAT(bill_master.bill_date, '%y/%m/%d') fd; 
SET fd=DATE_ADD(fd,INTERVAL 1 DAY); 
END WHILE; 
END $$ 

DELIMITER; 

错误:

Script line: 4 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 'fd; 
SET fd=DATE_ADD(fd,INTERVAL 1 DAY); 
END WHILE; 
END' at line 8 
+0

删除FD where子句中... –

+1

谢谢现在它的执行 –

+0

如果你有这个帖子上的解决方案,那么你应该遵循此http://元。 stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

回答

0

首先,你有两个ERREUR: 第一个是过程的名称

CREATE PROCEDURE `aad_adr`.` PROCEDURE MonthlySalesReport(fromdate DATE,todate DATE)`() 

--->

CREATE PROCEDURE `aad_adr`.`MonthlySalesReport`(fromdate DATE,todate DATE) 

所以你的程序应该是这样的:

DELIMITER $$ 
DROP PROCEDURE IF EXISTS `aad_adr`.`MonthlySalesReport`$$ 
CREATE PROCEDURE `aad_adr`.`MonthlySalesReport`(fromdate DATE,todate DATE) 
BEGIN 
Declare fd DATE; 
Declare ed DATE; 
SET fd=fromdate; 
SET ed=todate; 
WHILE DATE(fd)<=DATE(ed)DO 
select 
bill_master.bill_no, 
DATE_FORMAT(bill_master.bill_date,'%y/%m/%d') AS 'formatted_date', 
transaction.product_id, 
transaction.tax_amount, 
transaction.amount, 
transaction.amount-transaction.tax_amount as 'without_tax ', 
product_master.Product_name, 
product_master.vat 
from 
bill_master inner join transaction on bill_master.bill_no=transaction.bill_no 
inner join product_master on transaction.product_id=product_master.product_id 
where 
vat='14.50' and vat='14.50' and DATE_FORMAT(bill_master.bill_date, '%y/%m/%d'); 
SET fd=DATE_ADD(fd,INTERVAL 1 DAY); 
END WHILE; 
END $$ 
DELIMITER ; 
+0

抱歉,我没有注意到drop cammand,因此您还需要更新名称我编辑了我的答案,请尝试并告诉我它是否可以使用 – Cherif

+0

这应该工作,但你是什么意思 DATE_FORMAT(bill_master.bill_date,'%y /%m /%d')日期是这样在sql或bill_date是这样awlay这是一个VARCHAR? – Cherif

0

错误在您选择的查询中您错误地调用了条件。因此,只需删除where子句中的DATE_FORMAT并且需要再次修改,最后才将DELIMITER;替换为DELIMITER$$

更新1:修改SP的有效名称。

所以更新的代码是:DATE_FORMAT后

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `aad_adr`.`MonthlySalesReport` $$ 
CREATE PROCEDURE `aad_adr`.`MonthlySalesReport`(IN fromdate DATE,IN todate DATE) 
    BEGIN 
     DECLARE fd DATE; 
     DECLARE ed DATE; 
     SET fd=fromdate; 
     SET ed=todate; 
     WHILE DATE(fd)<=DATE(ed)DO 
      SELECT bill_master.bill_no,DATE_FORMAT(bill_master.bill_date, '%y/%m/%d') AS 'formatted_date',transaction.product_id,transaction.tax_amount,transaction.amount,transaction.amount-transaction.tax_amount AS 'without_tax ',product_master.Product_name,product_master.vat FROM bill_master INNER JOIN TRANSACTION ON bill_master.bill_no=transaction.bill_no INNER JOIN product_master ON transaction.product_id=product_master.product_id WHERE vat='14.50' AND bill_master.bill_date=fd; 
      SET fd=DATE_ADD(fd,INTERVAL 1 DAY); 
     END WHILE; 
    END $$ 
DELIMITER$$