Это то, что вы могли / должны были сделать:
Сначала тестовый пример:
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 (это была опечатка?).