select语句中不能使用参数

问题描述

我有一项任务要解决

创建一个函数,根据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 或声明另一个变量来保存该值。