编写一个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目标
答案 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"。