问题描述
创建一个函数,根据employee_id返回雇员所在部门的名称(department_name)。
如果员工没有分配到部门,则处理这种情况。
使用在 sql 语句中创建的函数。列出employee_id 160 的名字和姓氏、开始日期和部门名称。
我有这个,但有一个错误:表达式“EMP_ID”不能用作 SELECT / FETCH 语句的 INTO 目标。
我做错了什么?
create or replace function oddelenie(emp_id in employees.employee_id%type)
return varchar is dept_name departments.department_name%type;
begin
select employee_id,department_name into emp_id,dept_name
from employees join departments using (department_id);
return dept_name;
exception when no_data_found then
dbms_output.put_line('error');
end oddelenie;
谢谢。
解决方法
仅选择您需要的内容 - 部门名称。你会用员工的身份证做什么;你已经知道了,你把它作为参数传递了。
create or replace function oddelenie
(par_emp_id in employees.employee_id%type)
return varchar2
is
l_dept_name departments.department_name%type;
begin
select department_name
into l_dept_name
from employees join departments using (department_id)
where employee_id = par_emp_id;
return dept_name;
exception when no_data_found then
return 'error';
end oddelenie;
,
emp_id
是一个输入参数,因此您的 select
语句尝试覆盖其值是没有意义的。大概您想使用 emp_id
将结果过滤为一行。类似的东西
create or replace function oddelenie(emp_id in employees.employee_id%type)
return varchar
is
dept_name departments.department_name%type;
begin
select d.department_name
into dept_name
from employees e
join departments d using (department_id)
where e.employee_id = emp_id;
return dept_name;
exception when no_data_found then
dbms_output.put_line('error');
end oddelenie;
请注意,您的异常处理程序比无用更糟糕。仅向 dbms_output
写入内容的异常处理程序仅用于吞下异常。您不知道调用者是否真的会看到写入 dbms_output
的内容,或者调用者是否会在不知道过程失败的情况下愉快地继续。完全删除异常处理程序会好得多。如果你想保留它,返回一些占位符字符串,即
exception
when no_data_found
then
return 'No department';
end;
,
您尚未声明 emp_id
:
create or replace function oddelenie(emp_id in employees.employee_id%type)
return varchar
is
dept_name departments.department_name%type;
employee_id employees.employee_id%type;
begin
select employee_id,department_name into employee_id,dept_name
from employees join departments using (department_id);
return dept_name;
exception when no_data_found then
dbms_output.put_line('error');
end oddelenie;
您的参数 emp_id
是一个 IN 参数。将其声明为 IN OUT
或声明另一个变量来保存该值。