【问题标题】:Using NVL in PLSQL function在 PLSQL 函数中使用 NVL
【发布时间】:2021-08-23 15:40:36
【问题描述】:

我创建了一个函数,它应该接受employee_id 作为参数,并返回员工所赚取的总工资。如果佣金百分比为空,我应该在哪里放置 NVL 函数并返回零?

CREATE OR REPLACE FUNCTION TOTAL_SAL (vemp IN employees.employee_id%type)
RETURN NUMBER
IS
    vsalary     employees.salary%type;
    vcommission employees.commission_pct%type;

    CURSOR c_employee IS
    SELECT SALARY 
      FROM employees
     WHERE employee_id = vemp;

BEGIN
    OPEN c_employee;
    FETCH c_employee INTO vsalary;
    CLOSE c_employee;

    vsalary := vsalary + vsalary * vcommission;

    RETURN vsalary;

END;
/

【问题讨论】:

标签: oracle plsql oracle11g


【解决方案1】:

这就是你将如何使用它。

cursor c_employee is
select NVL(SALARY, 0)
FROM employees
where employee_id = vemp;

有关更多 PLSQL 内容和其他内容,这是一个很好的资源:

https://www.techonthenet.com/oracle/functions/nvl.php

【讨论】:

    【解决方案2】:

    你可以选择任何一种风格;

    1. 在 SQL SELECT 语句内;

      CURSOR c_employee IS
      SELECT NVL(salary,0)
        FROM employees
       WHERE employee_id = vemp;
      

    1. 在 PL/SQL 代码块内

      vsalary := NVL(vsalary,0) + NVL(vsalary,0) * NVL(vcommission,0);
      

      vsalary := vsalary + vsalary * NVL(vcommission,0);
      

      前提是 NVL() 函数已在 SELECT 语句中应用。

    注意到vcommission 需要NVL() 函数而不是薪水。

    顺便说一句,你的意思是vemp作为参数,而employee_id是表格的列

    【讨论】:

      【解决方案3】:

      为什么你认为你需要一个光标?如果您通过员工的ID,则只能返回一个(或没有)行,除非两个(或更多)员工共享相同的ID,这是完全错误的。

      因此,在我看来是这样的。

      对于以下示例数据...

      SQL> select * from employees where rownum <= 5;
      
      EMPLOYEE_ID     SALARY COMMISSION_PCT
      ----------- ---------- --------------
             7369        800
             7499       1600              3
             7521       1250              5
             7566       2975
             7654       1250             14
      

      ... 函数计算总工资(如果传递给它的 ID 无效,则返回 NULL):

      SQL> create or replace function total_sal (vemp in employees.employee_id%type)
        2    return number
        3  is
        4    retval number;
        5  begin
        6    -- presuming everyone has initial salary, there's no need
        7    -- to apply NVL to SALARY column's value
        8    select salary * (1 + nvl(commission_pct, 0)/100)
        9      into retval
       10      from employees
       11      where employee_id = vemp;
       12    return retval;
       13  exception
       14    when no_data_found then
       15      return null;
       16  end;
       17  /
      
      Function created.
      

      让我们测试一下:

      SQL> select e.*, total_sal(employee_id) total
        2  from employees e where rownum <= 5;
      
      EMPLOYEE_ID     SALARY COMMISSION_PCT      TOTAL
      ----------- ---------- -------------- ----------
             7369        800                       800
             7499       1600              3       1648   --> 3% out of 1600 is 48, so total = 1600 + 48 = 1648
             7521       1250              5     1312,5
             7566       2975                      2975
             7654       1250             14       1425
      
      SQL>
      

      对于无效的ID

      SQL> select total_sal(-1e99) total_sal from dual;
      
       TOTAL_SAL
      ----------
      
      
      SQL>
      

      我觉得不错。

      【讨论】:

        猜你喜欢
        • 2022-12-07
        • 2023-01-05
        • 2018-03-15
        • 1970-01-01
        • 1970-01-01
        • 2012-12-09
        • 2017-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多