我创造了一个程序。它给出了一个错误( ORA-01422:确切的fetch返回超过请求的行数)。对于一个特定的department_id,有不止一个员工。但如何解决这个问题呢?
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谢谢你,昆塔·罗伊
发布于 2014-04-07 21:10:24
我猜你想要的是(未经测试的)
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语句,就没有竞争条件。
https://stackoverflow.com/questions/22922583
复制相似问题