首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PL/SQL:执行过程

PL/SQL:执行过程
EN

Stack Overflow用户
提问于 2014-04-07 20:36:08
回答 1查看 88关注 0票数 0

我创造了一个程序。它给出了一个错误( ORA-01422:确切的fetch返回超过请求的行数)。对于一个特定的department_id,有不止一个员工。但如何解决这个问题呢?

代码语言:javascript
复制
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

谢谢你,昆塔·罗伊

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-07 21:10:24

我猜你想要的是(未经测试的)

代码语言:javascript
复制
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语句,就没有竞争条件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22922583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档