【问题标题】:Getting error 'Table,View Or Sequence reference 'EMPLOYEES.EMP_NAME' not allowed in this context'在此上下文中不允许出现错误“表、视图或序列引用“EMPLOYEES.EMP_NAME””
【发布时间】:2021-11-03 12:21:23
【问题描述】:
create table Employees (emp_id number, emp_name varchar2(50), salary number, department_id number, DESIGNATION varchar2(50), DEVELOPED_TESTED varchar2(50)) ;

insert into Employees values(1,'ALex',10000,10,'Developer','VLC');
insert into Employees values(2,'Duplex',20000,20,'Developer','VLC');
insert into Employees values(3,'Charles',30000,30,'Tester','Tested_VLC');
insert into Employees values(4,'Demon',40000,40,'Tester ','Tested_VLC');
insert into employees values(5,'Chaem',5000,50,'Developer','');

要求:

如果指定为“开发者”并且开发测试列为空,我想返回 2。但是在输出中我得到的是 null 而不是 2。你能检查一下吗?

代码:

        create or replace FUNCTION calculate_royalty (
    i_empno IN NUMBER
    
) RETURN VARCHAR2 IS
  l_employee employees%ROWTYPE;
BEGIN 
  SELECT *
    INTO l_employee
    FROM
        employees
    WHERE  emp_id = i_empno; 
  IF l_employee.designation = 'Developer' THEN
    RETURN l_employee.developed_tested;
  ELSIF l_employee.designation = 'Developer' and l_employee.developed_tested is null THEN 
    RETURN 2;
  ELSE
    RETURN 1;
  END IF;
  
EXCEPTION WHEN NO_DATA_FOUND THEN
  RETURN 0;
END ;

从双重中选择 CALCULATE_ROYALTY(5); -- 输出为 NULL,但理想情况下应该是 2。

【问题讨论】:

  • 您的测试脚本中没有“版税”列。

标签: plsql oracle-sqldeveloper plsqldeveloper


【解决方案1】:

只需将整行选择成一个变量,无需使用计数。使用NO_DATA_FOUND异常处理用户不存在的情况。

您的问题提到了与“版税”列相关的一些功能。您的测试用例中缺少这一点,但修改下面的代码应该是小菜一碟,以满足您的所有需求。

create or replace FUNCTION calculate_royalty (
    empno_i IN NUMBER
    -- don't use column names as names of input parameters, that is a recipe for disaster. Use prefix/suffix.
) RETURN VARCHAR2 IS
  lv_count NUMBER;
  l_employee employees%ROWTYPE;
BEGIN 
  SELECT *
    INTO l_employee
    FROM
        employees
    WHERE  emp_id = empno_i; 
  IF l_employee.designation = 'Developer' THEN
    RETURN l_employee.salary;
  ELSE
    RETURN 1;
  END IF;
  -- dbms_output just sends data to a buffer that you then print to the console. it cannot be used as a return value.
  --  RETURN dbms_output.put_line('Emp Name :'...
  
-- elsif needs to be followed by an expression. It cannot be followed by a RETURN keyword. Use "ELSE" instead if there is no condition.
-- elsif return 1;
EXCEPTION WHEN NO_DATA_FOUND THEN
  RETURN 0;
END ;
/

set serveroutput on size 999999
clear screen
BEGIN
  dbms_output.put_line('output for Developer: '|| calculate_royalty(EMPNO_I => 2));
  dbms_output.put_line('output for no Developer: '|| calculate_royalty(EMPNO_I => 3));
  dbms_output.put_line('output for non-existing user: '|| calculate_royalty(EMPNO_I => 10));
END;

output for Developer: 20000
output for no Developer: 1
output for non-existing user: 0


PL/SQL procedure successfully completed.

【讨论】:

  • 谢谢,但能否请您告诉我为什么在指定为 Developer 且 Developed_tested 列为空的最后一个条件下它不返回 2。它给了我 null 而不是 2。我已经编辑了原始问题中的更改
  • 我建议您研究我的代码,看看您是否可以自己编辑它以在这些条件下返回 2。毕竟你是在学习 pl/sql,所以你自己写的代码越多,你学到的就越多。
  • 对代码做了一些修改,但仍然没有返回 2
  • 逻辑错误。第一个条件为真,因此不再测试其他条件。将最严格的条件(返回 2 的条件)放在限制较少的条件(返回 developer_tested 的条件)之前,它应该可以工作。您还可以放置 dbms_output 语句来查看满足哪个条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2016-12-19
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
相关资源
最近更新 更多