我正在尝试创建一个pl/sql程序,该程序将从一个表中提高管理人员的薪资,如果薪资高于3000,则必须将其设置为3000,但我似乎无法做到这一点。我必须使用o程序,然后从匿名块调用它。
发布于 2015-03-30 06:40:28
在匿名块中,您要为每个经理调用该过程。在这个过程中,你把每个经理的工资提高了500。当街区退出的时候,你的经理们将会得到相当可观的加薪!
第一步是决定是在块中还是在过程中执行每个管理器的循环。第二步是,如果您希望在经理收入超过3000的情况下引发异常,那么您必须检查经理的收入是否超过3000。检查NULL,但仅此而已。不,异常处理程序中的签入不算在内。要达到这一目标,工资必须是零。
在本例中,我选择执行过程中的所有循环。它需要知道的是哪种工作类型得到加薪和加薪的数额。
CREATE OR REPLACE PROCEDURE Raise_Sal( Target_Job emp.JOB%TYPE, Amount NUMBER ) AS
Max_Sal Constant Number := 3000; -- Could also be passed in
Sal_Null Exception;
Sal_Too_Big Exception;
pragma exception_init( Sal_Null, -20101 );
pragma exception_init( Sal_Too_Big, -20102 );
CURSOR C1 IS
SELECT ID, Sal
FROM Emp
WHERE JOB = Target_Job
FOR UPDATE OF Sal; -- NOWAIT is redundant for cursors
BEGIN
FOR Emp IN C1 Loop BEGIN
IF Emp.Sal IS NULL THEN
Raise_Application_Error( -20101, 'Salary is missing' );
Elsif Emp.Sal > Max_Sal THEN
Raise Sal_Too_High;
Else
UPDATE Emp SET Sal = Curr_Sal + Amount WHERE CURRENT OF C1;
End If;
END;
Exception
WHEN Sal_Too_Big THEN
UPDATE Emp SET Sal = Max_Sal WHERE CURRENT OF C1;
WHEN Others THEN
Raise;
END loop;
END Raise_Sal;
/
DECLARE
V_Amount Constant Number := 500;
BEGIN
raise_sal( 'MANAGER', V_Amount );
end;
/这不是生产质量代码。首先,我会通过最高工资金额,这样这个程序就可以用于"SalesClerk“或"VicePresident”或"SQLDeveloper“或什么东西了。我相信每一个都有不同的最大值。但你似乎只对学习技术感兴趣,所以以它为例。
此外,戈登的回答指出了一个问题,你可能还没有找到。在加薪之前,您正在检查薪资是否大于最大值。如果它最终大于更新后的最大值,该怎么办?
发布于 2015-03-28 14:55:02
我认为基本的update是:
UPDATE emp
SET sal = (case when curr_sal + amount > 3000 then 3000
else curr_sal + amount
end)
WHERE job = 'MANAGER' ;我不知道这怎么适合你的程序,这似乎太复杂了。
https://stackoverflow.com/questions/29318520
复制相似问题