sql加薪程序
我正在尝试制作一个pl/sql程序,它将从一个表中提高经理的工资,如果工资高于3000,我必须将其设置为3000,但我似乎没有做到这一点。我必须使用o过程,然后从匿名块调用它 我认为基本的sql加薪程序,sql,plsql,Sql,Plsql,我正在尝试制作一个pl/sql程序,它将从一个表中提高经理的工资,如果工资高于3000,我必须将其设置为3000,但我似乎没有做到这一点。我必须使用o过程,然后从匿名块调用它 我认为基本的更新是: UPDATE emp SET sal = (case when curr_sal + amount > 3000 then 3000 else curr_sal + amount end) WHERE job
更新是:
UPDATE emp
SET sal = (case when curr_sal + amount > 3000 then 3000
else curr_sal + amount
end)
WHERE job = 'MANAGER' ;
我不确定这是否适合您的过程,因为您的过程似乎过于复杂。在匿名块中,您为每个经理调用该过程。在这个过程中,你将每个经理的工资提高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;
/
这不是生产质量代码。首先,我会将最高工资金额传递给你,这样这个过程就可以用于“销售人员”或“副总裁”或“SQLDeveloper”或你拥有的任何东西。我相信每一个都有不同的最大值。但你们似乎只对学习技巧感兴趣,所以就拿它作为例子吧
此外,戈登的回答指出了一个你可能还没有解决的问题。在加薪之前,您正在检查薪资是否高于最高限额。如果更新后它最终大于最大值,该怎么办?我必须将3000的限制设置为exception@KatyPiu . . . 看起来很不必要的复杂。如果这是学校作业,你应该在问题中提到这一点。这不是学校作业,但我想这样做。我已经按照你的建议做了,但我理解我可以做,除了例外和所有这些,我想看看它是什么样子。谢谢你的回答。这真的很有用。