【问题标题】:Parameter can't be used in the select statement参数不能在选择语句中使用
【发布时间】:2021-08-19 23:48:13
【问题描述】:

我有一个任务要解决。

创建一个函数,根据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;

谢谢。

【问题讨论】:

  • 我会认真重新考虑 exception when no_data_found then dbms_output.put_line('error'); 也是 varchar2,而不是 varchar

标签: sql oracle plsql error-handling plsqldeveloper


【解决方案1】:

只选择您需要的 - 部门名称。你会如何处理员工的身份证;你已经知道了,你把它作为参数传递了。

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;

【讨论】:

  • 谢谢 :) @Littlefoot
【解决方案2】:

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;

【讨论】:

  • 谢谢,很有帮助:)
  • 我也想请教一下如何调用这个函数来打印部门的姓名和姓名? @贾斯汀洞穴
  • @Kristina - 可能类似于select name, surname, oddelenie(employee_id) department_name from employees。为函数选择一个更具描述性的名称通常是有意义的(即get_department_name
  • 我试过这个 :select first_name, last_name, oddelenie(107), hire_date from employees; 但它会返回所有员工,我只需要有关 employee_id 107 的信息。谢谢 :)
  • @Kristina - 然后在employee_id 上添加where 子句。
【解决方案3】:

你还没有声明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 或声明另一个变量来保存该值。

【讨论】:

  • 谢谢 :) @gmiley
猜你喜欢
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 2010-12-13
  • 2019-09-09
  • 1970-01-01
  • 2020-08-19
相关资源
最近更新 更多