【问题标题】:PLSQL function wont return salary where name of the employee is passed in as a parameterPLSQL函数不会返回员工姓名作为参数传入的薪水
【发布时间】:2018-10-18 23:19:34
【问题描述】:

这是我的 PLSQL 函数:

Create or Replace FUNCTION getEmpSalary(p_name in VARCHAR)
Return NUMBER IS

    l_return_salary;
    l_salary;
    table_salary NUMBER;
BEGIN
         Select salary into table_salary from AlphaCoEmp where p_name = p_name;
     return l_return_salary;
END;
/
show errors;

我已经建立了一个包含以下元组的表:

NAME              TITLE            SALARY
------------------------- --------------------
Wong                            91296
Utech                           82058
Vega                            86858
Weiser                          79771

我正在尝试编写一个 PLSQL 函数来返回作为参数传递的名称的薪水。

这就是我作为参数传递的方式:注意:param1 是选择的名称。

exec setEmpSalary(Utech);

我收到以下错误:

ERROR at line 1:
ORA-06550: line 1, column 20:
PLS-00201: identifier 'UTECH' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我不确定这个错误是如何产生的,并且可以使用一些帮助来修复错误。感谢您的宝贵时间。

【问题讨论】:

  • CREATE FUNCTION 不会编译,你声明的变量没有类型(l_return_salaryl_salary)。这是实际的代码吗?我不这么认为。然后你想在你的调用中传递一个字符串文字,所以你必须用单引号将它括起来。 EXEC 用于执行过程而不是函数。而且您拼错了名称(set vs get)。试试SELECT getEmpSalary('UTECH') FROM dual;。但我想它不会给你任何东西,因为= 通常区分大小写(“UTECH”与“Utech”)。如果您想要不区分大小写的匹配,请在= 的两侧使用upper()(或lower())。

标签: sql plsql sql-function


【解决方案1】:

你的调用代码有问题——需要声明UTECH——或者你需要在它周围加上单引号。

更重要的是,函数的代码是错误的,因为它混淆了参数名和列名。

我想你想要:

Create or Replace FUNCTION getEmpSalary (in_p_name in VARCHAR)
Return NUMBER IS
    l_return_salary NUMBER;
BEGIN
     Select salary into l_return_salary
     from AlphaCoEmp ace
     where ace.p_name = in_p_name;
     return(l_return_salary);
END;

【讨论】:

  • Utech 是员工的名字,@Gordon,它不是变量 :)
【解决方案2】:

这是你可能/应该做的:

首先,一个测试用例:

SQL> create table test
  2    (ename  varchar2(10),
  3     salary number
  4    );

Table created.

SQL> insert into test (ename, salary)
  2    select 'Wong' , 91296 from dual union
  3    select 'Utech', 82058 from dual;

2 rows created.

一个函数:

  • 注意我声明参数和返回值的方式——它们都使用了它们引用的列的适当数据类型
  • 我在选择工资时使用了 MAX 函数。为什么?因为,如果您传递无效的员工姓名,函数将返回 NO_DATA_FOUND 错误。另一种 - 可能是更好的方法 - 是使用 EXCEPTION 部分来处理它,例如

    begin
      select ...
    exception
      when no_data_found then return null;
    end;
    

    尽管如此,MAX 是一种又快又脏的解决方案,可以让您在代码的测试阶段免于打字。


SQL> create or replace function get_emp_salary(p_ename in test.ename%type)
  2    return test.salary%type
  3  is
  4    retval test.salary%type;
  5  begin
  6    select max(t.salary)
  7      into retval
  8      from test t
  9      where t.ename = p_ename;
 10
 11    return retval;
 12  end;
 13  /

Function created.

好的,让我们看看它的作用:

SQL> select get_emp_salary('Utech') from dual;

GET_EMP_SALARY('UTECH')
-----------------------
                  82058

SQL> select get_emp_salary('Littlefoot') from dual;

GET_EMP_SALARY('LITTLEFOOT')
----------------------------


SQL>

似乎还可以。

在您的函数中,有 3 个局部变量。其中前两个被无效声明(无数据类型)。 SELECT 然后将薪水选择到“table_salary”中,但您返回的“l_return_salary”始终为 NULL - 为什么要这样做?

由于您收到错误(“PLS-00201:必须声明标识符'UTECH'”),这意味着您传递的参数值没有单引号,因为您传递的是员工name(这是一个字符串)。

另外,您正在执行 setEmpSalary,而函数是 get(是拼写错误吗?)。

【讨论】:

    【解决方案3】:

    试试

    Create or Replace FUNCTION getEmpSalary(p_name in VARCHAR)
    Return NUMBER IS
        l_return_salary number;
    BEGIN
        Select salary
          into l_return_salary
         from AlphaCoEmp
        where name = p_name;
         return l_return_salary;
    exception
    when others then 
       return 0;
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多