【问题标题】:Write a program annual income of the emp and find the income tax写一个程序 emp 的年收入并找到所得税
【发布时间】:2017-07-13 11:43:28
【问题描述】:

写一个emp的程序年收入,并找到employee表的所得税。

输出应该是 first_name、salary、ann_sal 和 tax。

  • i) 如果年收入 > 60000,则税为收入的 10%
  • ii) 如果年收入 > 100000,则税为 800 卢比+收入的 16%
  • iii) 如果年收入 > 140000 则税收为 2500 卢比+收入的 25%

样本数据

FIRST_NAME              SALARY

Steven                    24000
Neena                     17000
Lex                       17000
Alexander                  9000
Bruce                      6000
David                      4800
Valli                      4800
Diana                      4200
Nancy                     12008
Daniel                     9000

这是我的程序:

DECLARE
    CURSOR income
    IS
        SELECT first_name,
            salary,
            salary*12 ann_sal
        FROM EMPLOYEES;
    z income%rowtype;
    ann_sal NUMBER(8,2);
    tax     NUMBER(8,2);
BEGIN
    OPEN income;
    LOOP
        FETCH income
        INTO z;
        EXIT
    WHEN income%notfound;
        IF ann_sal>60000 THEN
            tax  :=ann_sal*10/100;
        elsif ann_sal>100000 THEN
            tax     :=800+ann_sal*16/100;
        elsif ann_sal>140000 THEN
            tax     :=2500+ann_sal*25/100;
        ELSE
            tax:='';
        END IF;
        dbms_output.put_line(z.first_name || '  ' || z.salary || ' ' ||z.ann_sal|| '  ' || z.tax);
    END LOOP;
    CLOSE income;
END;  

就是这样。

【问题讨论】:

  • 看起来很简单。你哪里有困难?
  • 我无法在输出中显示税收列。
  • 您可以发布您的查询吗?
  • 而不是z.tax in dbms_output.put_line,只需使用tax 作为光标的一部分。
  • 但仅使用税后未显示税列@Nitish

标签: sql plsql cursor


【解决方案1】:

你去吧。我已经重新编写了代码。让我知道输出是否符合预期。

   DECLARE
        CURSOR income IS
          SELECT first_name,
                 salary,
                 salary * 12 ann_sal
          FROM   employees;
        z       income%ROWTYPE;
        tax     NUMBER(8, 2);
    BEGIN
        OPEN income;

        LOOP
            FETCH income INTO z;

            exit WHEN income%NOTFOUND;

            IF z.ann_sal > 60000 THEN
              tax := z.ann_sal * 10 / 100;
            ELSIF z.ann_sal > 100000 THEN
              tax := 800 + z.ann_sal * 16 / 100;
            ELSIF z.ann_sal > 140000 THEN
              tax := 2500 + z.ann_sal * 25 / 100;
            ELSE
              tax := '';
            END IF;

            dbms_output.Put_line(z.first_name
                                 || '  '
                                 || z.salary
                                 || ' '
                                 ||z.ann_sal
                                 || '  '
                                 || tax);
        END LOOP;

        CLOSE income;
    END; 

【讨论】:

  • 如果你正在清理它,你可能会摆脱 open-fetch-exit-close 结构并用更简单的光标 FOR 循环替换它。如果真的需要整个循环业务的话。
【解决方案2】:

您不需要为此使用 PL/SQL。

select first_name
     , salary
     , salary * 12 ann_sal
     , case
           when salary * 12 > 140000 then 2500 + (salary * 12 * 25) / 100
           when salary * 12 > 100000 then  800 + (salary * 12 * 16) / 100
           when salary * 12 >  60000 then salary * 12 * 10 / 100
           else 0
       end as tax
from   employees;

请注意,任何超过 100000 的薪水也超过 60000,因此在您的原始代码中,您永远不会达到 > 100000> 140000 条件。我已经重新安排了从最高薪水向下检查的条件。

如果出于某种原因你真的需要在 PL/SQL 循环中使用它,则无需声明任何内容:

begin
    for r in (
        select first_name
             , salary
             , salary * 12 ann_sal
             , case
                   when salary * 12 > 140000 then 2500 + (salary * 12 * 25) / 100
                   when salary * 12 > 100000 then  800 + (salary * 12 * 16) / 100
                   when salary * 12 >  60000 then salary * 12 * 10 / 100
                   else 0
               end as tax
        from   employees
        order by first_name
    )
    loop
        dbms_output.put_line(rpad(r.first_name,15) || lpad(r.salary,9) || lpad(r.ann_sal,9) || lpad(r.tax,9));
    end loop;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多