Функция PLSQL не возвращает зарплату, где имя сотрудника передается в качестве параметра - PullRequest
0 голосов
/ 09 мая 2018

Вот моя функция 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

Я не уверен относительно того, как создается эта ошибка, и мог бы использовать некоторую помощь для ее исправления. Спасибо за ваше время.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Попробуйте

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;
0 голосов
/ 09 мая 2018

Это то, что вы могли / должны были сделать:

Сначала тестовый пример:

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.Другой - и, возможно, лучший способ - это справиться с этим с разделом ИСКЛЮЧЕНИЯ, таким как

    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 (который является строкой).

Кроме того, вы'выполняется set EmpSalary, в то время как функция get (это была опечатка?).

0 голосов
/ 09 мая 2018

У вас проблема с вашим кодом вызова - необходимо объявить 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;
...