我是PL / SQL的新手。在这个PL / SQL程序中,有人可以帮助我吗?

时间:2015-03-28 09:10:17

标签: oracle stored-procedures plsql

编写一个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目标

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

问题在于" v_emp_no"和" v_salary"是您的过程(IN)的输入。

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

例如,您有:

v_emp_no in emp1.empno%type

你需要:

v_emp_no in out emp1.empno%type

编辑

你可能做得更好的是为"选择null来自emp,其中ename =' BLAKE'和1000到2000之间的萨尔和#34;然后看看是否会返回任何值。如果是这种情况,您可以将布尔值设置为TRUE。

后来有IF fBoolean那么删除..... 这样你就不必覆盖" v_emp_no"和" v_salary"。