无法执行过程,因为fetch返回的行数多于请求的行数

时间:2014-02-03 16:20:38

标签: sql oracle plsql

CREATE OR REPLACE
PROCEDURE P_raise
AS
  v_salary     NUMBER;
  v_first_name VARCHAR2(20);
  v_min_salary NUMBER;
BEGIN
  SELECT first_name,
    salary
  INTO v_first_name,
    v_salary
  FROM employees
  WHERE salary =
    (SELECT MIN(salary) FROM employees
    );
  dbms_output.put_line(v_first_name||' has a minimum salary of '||v_salary);
  SELECT MIN(salary) INTO v_min_salary FROM employees;
  IF v_salary = v_min_salary THEN
    UPDATE employees SET salary = salary*1.15 WHERE salary=v_min_salary;
    dbms_output.Put_line(v_first_name||' has an increase of 15% in his salary ');
  END IF;
END;
/

这个凌乱的代码用于找到min(薪水),然后给它加薪。 有两个具有相同值的最低工资记录。如何通过传递错误来修改我的代码?

由于

1 个答案:

答案 0 :(得分:1)

如果语句没有返回一行,则无法使用SELECT INTO。在这里你可以使用循环,例如使用隐式游标:

CREATE OR REPLACE PROCEDURE P_raise AS
BEGIN
   FOR cc IN (SELECT first_name, salary, ROWID
                INTO v_first_name, v_salary
                FROM employees
               WHERE salary = (SELECT MIN(salary) FROM employees)
                 FOR UPDATE NOWAIT) LOOP

      dbms_output.put_line(cc.first_name || ' has a minimum salary of ' 
                           || cc.salary);
      UPDATE employees SET salary = salary * 1.15 WHERE ROWID = cc.rowid;
      dbms_output.Put_line(cc.first_name 
                           || ' has an increase of 15% in his salary');

   END LOOP;
END;

或者使用直接更新(一般情况下会更有效率,但您不会更新哪一行的详细信息):

CREATE OR REPLACE PROCEDURE P_raise AS
BEGIN
   UPDATE employees 
      SET salary = salary * 1.15 
    WHERE salary = (SELECT MIN(salary) FROM employees);
   dbms_output.put_line(SQL%ROWCOUNT 
                        || ' employees had their salary increased by 15%');
END;