我正在使用一些例子学习存储过程。
使用社会保障号列创建一个表Employee
。 (主键),名称,位置,没有。家属,年薪。
编写并执行T-SQL存储过程Compute_Tax
以执行以下操作:
Tax
Tax
表Employee
中填入数据
所得税根据年薪S和受抚养人数D计算。
Net Salary: S - (7000 + D*950)
Tax Computed as follows:
10% of the first 15,000 of net salary;
plus 15% of the next 15,000 of net salary;
plus 28% of any net salary over 30,000.
CREATE DEFINER=`root`@`localhost` PROCEDURE `computeTax`()
BEGIN
DECLARE ssn NCHAR(20);
DECLARE noOfDependent INT;
DECLARE annualSalary DOUBLE;
DECLARE netSalary DOUBLE;
DECLARE tax DOUBLE;
DECLARE empCur CURSOR FOR
SELECT socialSecurityNumber, noOfDependents, annualSalary FROM `dbTest`.Employee;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN empCur;
FETCH empCur
INTO ssn, noOfDependent, annualSalary;
CREATE TABLE IF NOT EXISTS TAX
(ssn VARCHAR(20),
incomeTax DOUBLE
);
myLoop: LOOP
SET netSalary = annualSalary - (7000 + noOfDependent * 950);
IF (netSalary < 0 ) THEN
LEAVE myLoop;
END IF;
IF (netSalary < 15000) THEN
SET tax = 0.1 * netSalary;
ELSE IF (netSalary > 15000) THEN
IF (netSalary > 30000) THEN
SET tax = 0.10 * 15000 + 0.15 * 15000 + 0.28 * (netSalary - 30000);
ELSE
SET tax = 0.10 * 15000 + 0.15 * (netSalary -15000);
END IF;
END IF;
END LOOP myLoop;
INSERT INTO TAX(ssn, incomeTax) VALUES(ssn, tax);
FETCH empCur
INTO ssn, noOfDependent, annualSalary;
CLOSE empCur;
END;
我在代码上方的 END 和 END循环myLoop 上收到了一些语法错误。
答案 0 :(得分:1)
我至少看到两个问题:
您使用SET done = true
,但不要声明名为done
的变量。
您在IF / THEN / END IF
块中开始嵌套ELSE
语句,但只有一个END IF
。
请注意,ELSE IF
与存储过程语言中的ELSIF
不同。前者启动嵌套在外部语句的IF
块中的新ELSE
语句。后者继续现有的IF/THEN/END IF
声明。
您需要将其结构化为以下之一:
IF ... THEN
<code>
ELSE
<code>
IF ... THEN
<code>
END IF;
<code>
END IF;
或者:
IF ... THEN
<code>
ELSIF ... THEN
<code>
END IF;
为了它的价值,我不会使用MySQL存储过程。在大多数情况下,它们非常低效,并且它们不支持其他RDBMS产品(如Oracle或Microsoft SQL Server)中的软件包,调试器或存储过程的许多其他优秀功能。
我不推荐在MySQL中使用存储过程,因为您已经习惯在其他数据库平台中使用它们。使用Ruby或Python等脚本语言开发起来要容易得多。