我正在练习PLSQL,我正在编写一个包含两个函数的包来更新佣金,另一个更新薪水,但现在我想在同一个包中创建一个过程,以更新所有使用函数的员工的佣金和工资在包裹上。可能吗?如何在过程中调用函数来更新PLSQL上的表的所有记录?
CREATE OR REPLACE PACKAGE BODY emp_upd_pkg IS
-- Function to update commission_pct --
FUNCTION comm_upd(
p_empid employees.commission_pct%TYPE)
RETURN NUMBER
IS
v_new_comm employees.commission_pct%TYPE;
BEGIN
UPDATE employees
SET commission_pct = commission_pct * 1.1
WHERE employee_id = p_empid;
SELECT commission_pct
INTO v_new_comm
FROM employees
WHERE employee_id = p_empid;
RETURN v_new_comm;
EXCEPTION
WHEN
NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20992, 'NO EXISTE EMPLEADO');
END comm_upd;
-- Function to update salary --
FUNCTION sal_upd(
p_empid employees.salary%TYPE)
RETURN employees.salary%TYPE
IS
v_newsal employees.salary%TYPE;
BEGIN
UPDATE employees
SET salary = salary + 350
WHERE employee_id = p_empid;
-- Consulta select para la salida del a funcion --
SELECT salary
INTO v_newsal
FROM employees
WHERE employee_id = p_empid;
RETURN v_newsal;
END sal_upd;
-- Procedure to update all records of employees table --
PROCEDURE comm_sal_upd(
p_new_comm employees.commission_pct%TYPE,
p_new_sal employees.salary%TYPE);
END emp_upd_pkg;
我试过创建一个游标和获取功能,但我没有成功。
PROCEDURE comm_sal_upd(
p_new_comm employees.commission_pct%TYPE,
p_new_sal employees.salary%TYPE)
IS
CURSOR emp_cur IS
SELECT commission_pct, salary
FROM employees;
BEGIN
OPEN emp_cur;
FETCH emp_cur
INTO emp_upd_pkg.comm_upd(p_comm), emp_upd_pkg.sal_upd(p_sal);
CLOSE emp_cur;
END comm_sal_upd;
你的功能会更有意义的过程。你也传入employee_ids,所以他们应该是'employees.employee_id%TYPE'。 –
你想'comm_dal_upd'做什么?是否应该对所有员工应用指定的佣金和薪资调整?如果是这样,您的佣金和工资程序/函数应接受'p_new_comm'和'p_new_sal'作为参数,并使用它们代替硬编码值。 –
感谢您的回复。其实我认为你是对的,所以是否可以编写一个过程,然后使用RETURNING属性作为comm_sal_upd过程的参数? - com,_sal_upd是一个过程,用于使用comm_upd和sal_upd函数更新所有雇员的工资和调用。 – Rattlesnake