在Mysql存储过程中查找错误。无法理解错误

时间:2017-02-02 16:54:35

标签: mysql stored-procedures

此存储过程中可能存在哪些问题?我在这段代码中有语法错误,我无法理解。代码中的sql查询运行完全正常,但是当我尝试将其作为存储过程编写时,它会抛出语法错误。 错误是:

  

[查询1中的错误] PROCEDURE 1bot已存在

     

[查询2中的错误]您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在“DELIMITER”附近使用' DELIMITER'在第1行

DELIMITER ;;
CREATE PROCEDURE `1bot`()

BEGIN
SELECT  
COUNT(distinct orders.customer_id) as Total_Customers, 
date_format(orders.created_at,'%M %Y') as month, 
COUNT(orders.`increment_id`) as Unique_single_orders, 
SUM(orders.`base_subtotal`) as total_rev,  
SUM(billing.`total` + 5) as COGS, (
SUM(orders.`base_subtotal`) - SUM(billing.total + 5)) as marketing_expense, 
(AVG(orders.`base_subtotal`) - AVG(billing.total + 5)) as avg_acquisition_cost

FROM `sales_flat_order` as orders

LEFT JOIN `sales_flat_order_item` as items on orders.`entity_id` = items.`order_id` 

LEFT JOIN `vingo_billing` as billing on orders.`increment_id` = billing.`order_number`

WHERE orders.`created_at` between '2016-09-01 00:00:00' and '2017-01-23'

AND items.sku LIKE "%1bot%"

AND orders.status != "closed"
and orders.shipping_invoiced != '15'
and billing.total > 0
and orders.`total_qty_ordered` < 2;

END ;;
DELIMITER ;

1 个答案:

答案 0 :(得分:1)

  

程序1bot已经存在

这是不言自明的。您显然已经创建了一个名为1bot的过程。 MySQL给你一个错误,因为替代方法是用你定义的那个静默替换现有的程序,这可能是不同的。 MySQL正在保护您免受破坏您可能需要的过程。

如果您希望破坏现有程序并将其替换为新代码,则必须先删除它:

DROP PROCEDURE `1bot`;;
CREATE PROCEDURE `1bot`() ...

请注意,如果您尝试CREATE TABLE并命名已存在的表,则会给出类似的错误。

  

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在“DELIMITER&#39;

附近使用正确的语法

您应该知道DELIMITER语句只能在mysql命令行客户端中识别。目的是更改语句分隔符,通常为;\G,因为否则您无法使用包含多个以分号分隔的语句的正文来定义存储过程或触发器。 / p>

而在大多数其他界面中,例如phpMyAdmin,MySQL Workbench,或者在应用程序中运行SQL语句时,一次只能运行一个语句,因此不存在歧义。因此,DELIMITER在这些接口中不是必需的,也不是允许的。