【发布时间】:2016-12-07 22:33:58
【问题描述】:
我正在练习 PLSQL,我正在编写一个包含 2 个函数来更新佣金和另一个函数来更新薪水的程序包,但现在我想在同一个程序包中创建一个程序来更新所有员工的佣金和薪水,使用包装上的功能。有可能吗?
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 函数更新所有员工工资和佣金的程序。
-
是的,但是
p_new_comm和p_new_sal参数是干什么用的? -
好吧,我已经创建了这些参数来分配所有员工的新工资和新佣金,但现在我明白了你的意思。不需要在程序中添加参数,因为工资和佣金条件在其他函数中!!!