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(薪水),然后给它加薪。 有两个具有相同值的最低工资记录。如何通过传递错误来修改我的代码?
由于
答案 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;