2014-04-07 29 views
0

我已经创建了一个过程。它给出了一个错误(ORA-01422:确切的提取返回比请求的行数多)。至于具体的department_id,有多个员工。但如何解决这个问题?PL/SQL:执行过程

Create Procedure PP1 
(ID in number, Percent in number, Sal out number, increase_sal out number) IS  
Begin 
Select salary, salary *(1+percent/100) into sal, increase_sal  
From employees  
where department_id= id;  
DBMS_OUTPUT.PUT_LINE (sal || ' ' || increase_sal);  
END;  
/ 

Variable a number 
Variable b number 
Exec PP1 (100, 10, :a, :b) 
Print a b 

感谢, Kuntal罗伊

+0

你期望你的输出是什么?一个变量一次只能保存一个值,所以你不能执行返回多行的'select ... into ...'。 – GriffeyDog

+0

是的。如果我将使用employee_id = id而不是department_id = id,则该过程将返回值。 但是如果我想增加特定部门的工资怎么做? – user2788235

+0

正确,那么当您使用'department_id'代替时,您希望'a'和'b'的值从您的过程中出来?你想达到什么目的? – GriffeyDog

回答

1

我的猜测是,你想要的东西,像(未经测试)

CREATE TYPE num_tbl IS TABLE OF NUMBER; 

CREATE PROCEDURE raise_dept_salaries(p_dept_id IN employees.department_id%type, 
             p_raise_pct IN NUMBER, 
             p_old_sals OUT num_tbl, 
             p_new_sals OUT num_tbl) 
AS 
BEGIN 
    SELECT salary 
    BULK COLLECT INTO p_old_sals 
    FROM employees 
    WHERE department_id = p_dept_id; 

    UPDATE employees 
     SET salary = salary * (1 + p_raise_pct) 
    WHERE department_id = p_dept_id 
RETURNING salary 
    BULK COLLECT INTO p_new_sals; 
END; 

现在,分裂的事情了这种方式确实引入的可能性,一些其他的会议会修改您的第一个SELECT和您的UPDATE之间的数据,因此这在多用户环境中使用并不安全。当然,因为你已经知道他们将会直接相关,所以你真的不希望返回新旧薪水。如果你只返回新薪水的收集,那么你只需要一个UPDATE声明,你就不会有竞争条件。

+0

我已经做了同样的事情,但通过使用记录和光标。 但是你的过程要容易得多 – user2788235