无法创建此存储过程。这有什么问题

问题描述 投票:2回答:1

我一直在尝试在phpMyAdmin(MySQL)中创建这个存储过程,它给了我一个错误,我在下面说过。我有两个变量,即提前和支付。这是为了获得价值并减去员工从他已支付的款项中支付的贷款,以退还剩余的款项。我已经尝试了一切,但我找不到错误。我需要帮助。

CREATE PROCEDURE getadvancebalance( IN e int, d date) 
BEGIN  

DECLARE advance float(50);
DECLARE paid    float(50);

SELECT SUM(Amount) INTO advance
FROM vw_employee_advances
WHERE (entity_id = @e) AND (start_date <= @d) AND (approve_status = 'Approved')
IF (advance is null) THEN SET advance := 0; END IF;

SELECT SUM(Amount) INTO paid
FROM vw_advance_deductions
WHERE (entity_id = @e) AND (start_date <= @d);
IF (paid is null) THEN SET paid := 0; END IF;

advance := advance - paid;

RETURN advance;
END 

这是错误,我得到:MySQL说:文档#1064 - 你的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第4行的''附近使用正确的语法

mysql stored-procedures
1个回答
1
投票

你有一些语法错误,你应该这样做:

DELIMITER //
CREATE function getadvancebalance( e int, d date) returns integer
BEGIN  
  DECLARE advance float(50);
  DECLARE paid    float(50);

  SELECT SUM(Amount) INTO advance
  FROM vw_employee_advances
  WHERE (entity_id = e) AND (start_date <= d) AND (approve_status = 'Approved');

  IF (advance is null) THEN 
      SET advance = 0; 
  END IF;

  SELECT SUM(Amount) INTO paid
  FROM vw_advance_deductions
  WHERE (entity_id = e) AND (start_date <= d);

  IF (paid is null) THEN 
     SET paid = 0; 
  END IF;

  set advance = advance - paid;

  RETURN advance;
END //
DELIMITER ;

在MySql 5.6中测试。*

一些注释,为变量使用有意义的名称(e和d不是);不要在参数中使用@,你似乎将本地查询变量与函数/过程参数混合;因为你返回的东西应该是一个函数,而不是一个过程。

© www.soinside.com 2019 - 2024. All rights reserved.