Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql加薪程序_Sql_Plsql - Fatal编程技术网

sql加薪程序

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

我正在尝试制作一个pl/sql程序,它将从一个表中提高经理的工资,如果工资高于3000,我必须将其设置为3000,但我似乎没有做到这一点。我必须使用o过程,然后从匿名块调用它

我认为基本的
更新是:

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 . . . 看起来很不必要的复杂。如果这是学校作业,你应该在问题中提到这一点。这不是学校作业,但我想这样做。我已经按照你的建议做了,但我理解我可以做,除了例外和所有这些,我想看看它是什么样子。谢谢你的回答。这真的很有用。