存储过程计算税率

时间:2017-12-05 00:51:08

标签: mysql stored-procedures

我正在使用一些例子学习存储过程。

使用社会保障号列创建一个表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 上收到了一些语法错误。

1 个答案:

答案 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等脚本语言开发起来要容易得多。