【问题标题】:I am new to PL/SQL.Can some one help me in this PL/SQL procedure?我是 PL/SQL 的新手。有人可以在这个 PL/SQL 过程中帮助我吗?
【发布时间】:2015-06-01 15:38:00
【问题描述】:

编写一个 PL/SQL 过程,将员工编号和薪水作为输入参数,并从员工表中删除经理为“BLAKE”且薪水介于 1000 和 2000 之间的员工。

我写了下面的代码:-

create  or replace procedure processing(v_emp_no in emp1.empno%type,v_salary in emp1.sal%type)
is 
begin

select empno,sal into v_emp_no,v_salary
from emp where ename = 'BLAKE' and sal between 1000 and 2000;
delete from emp1
where empno  = v_emp_no
and sal = v_salary; 
end;

出现以下错误:-

第 5 行出错:PLS-00403:表达式“V_EMP_NO”不能用作 SELECT/FETCH 语句的 INTO 目标

【问题讨论】:

  • 这正是你所做的;那你为什么忽略输入参数?你到底想在这里做什么?
  • 是的,我知道你会遇到什么错误(不过如果你把这个放在你的问题中总是更好,你可以edit)。然而,我问的不是这个。你的代码没有意义。如果您正在输入这些参数,为什么要尝试覆盖它们?为什么不只使用它们来执行删除?如果您不想删除输入的值,我认为不需要将它们作为参数。那么,您究竟想在这里实现什么目标?
  • 我不想使用 fetch 覆盖参数...我想通过过程调用...但不知道该怎么做...所以在学习阶段需要帮助。如果你理解问题陈述,请写你的代码sn-p。
  • 是否传递参数进行删除?如果是这样,你为什么在 SP 中使用 select?你的输入参数到底是什么?是否要输入员工编号和现有工资作为输入,并检查员工的工资是否在 1000 和 2000 范围内,然后删除?
  • 是的,我想传递参数以进行删除。选择语句..是的,我不应该使用 then....输入参数是员工编号和薪水,是的,我必须检查两个条件 1. 如果经理是 'BLAKE' 和 2. 薪水在 1000 到 2000 之间

标签: oracle stored-procedures plsql


【解决方案1】:

输入参数不能在函数或过程中赋值,而且您的输入参数不用作输入,因此将它们声明为局部变量并使用它们。

 create  or replace procedure processing
 is 
  l_emp_no emp1.empno%type;
  l_salary  emp1.sal%type;
 begin
  select empno,sal into l_emp_no,l_salary
  from emp where ename = 'BLAKE' and sal between 1000 and 2000;
  delete from emp1
  where empno  = l_emp_no
  and sal = l_salary; 
 end;

调用过程为

begin
 processing;
end;

Edit1:- 如果您需要获取 emp_no 的输出并删除薪水 在 emp1 中使用 out 参数。

 create  or replace procedure processing
 (v_emp_no OUT emp1.empno%type,v_salary OUT emp1.sal%type)
 is 
  l_emp_no emp1.empno%type;
  l_salary  emp1.sal%type;
 begin
  select empno,sal into l_emp_no,l_salary
  from emp where ename = 'BLAKE' and sal between 1000 and 2000;
  delete from emp1
  where empno  = l_emp_no
  and sal = l_salary; 

  v_emp_no:=l_emp_no;
  v_salary:=l_salary;
 end;

称它们为

declare
p_emp_no emp1.empno%type;
p_salary emp1.sal%type;
begin
 processing(p_emp_no,p_salary);
 dbms_output.put_line('the employee deleted in emp1 is '||p_emp_no);
 dbms_output.put_line('the employee salary is '||p_salary);
end;

【讨论】:

    【解决方案2】:

    问题在于“v_emp_no”和“v_salary”是您的程序 (IN) 的输入。

    如果您希望您的程序能够修改它(能够将值放入其中),那么您需要通过在您的程序中将其声明为 IN OUT 来告诉该程序。

    例如,你有:

    v_emp_no in emp1.empno%type
    

    你需要:

    v_emp_no in out emp1.empno%type
    

    编辑

    您可能更好的做法是为“从 ename = 'BLAKE' 和 sal 在 1000 到 2000 之间的 emp 中选择 null”创建一个光标。然后看看那个是否返回任何值。如果是这种情况,您可以将布尔值设置为 TRUE。

    然后有 IF fBoolean THEN delete ..... 这样您就不必覆盖“v_emp_no”和“v_salary”。

    【讨论】:

    • 是的,但是这样做绝对没有意义;因为你总是会覆盖你输入的内容,所以没有必要输入任何数据,这正是 OP 想要做的。
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2020-02-27
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多