因小弟刚刚接触oracle,在程序开发中需要用到下面的存储过程,在线求大家写一个,谢谢!
EMP雇员表中有staffno(工号),sala(薪水),indate(入职日期)3个字段。请编写一个存储过程,给2006年前入职的员工加薪300元,给2007年入职的员工加薪200元,其他员工加薪100元(要求用游标实现)
EMP雇员表中有staffno(工号),sala(薪水),indate(入职日期)3个字段。请编写一个存储过程,给2006年前入职的员工加薪300元,给2007年入职的员工加薪200元,其他员工加薪100元(要求用游标实现)
我的回答是,此问题根本不需要存储过程,一句UPDATE就行了
如果你实在要,翻我以前回答的贴子吧
update EMP set sala=
case when indate<to_date('20060101','yyyymmdd') then sala+300
when indate between to_date('20070101','yyyymmdd') and to_date('20071231','yyyymmdd') then sala+200
else sala+100
end;
r_1 emp%ROWTYPE; FOR r_1 IN c1 LOOP IF to_char(to_date('2006-1-1','yyyy-mm-dd'),'yyyymm')-to_char(indate,'yyyymm'))>=0 THEN v_sa:=r_1.sala+300; ELSEIF to_char(to_date('2007-8-1','yyyy-mm-dd'),'yyyymm')-to_char(indate,'yyyymm'))>=0 THEN v_sa:=r_1.sala+200; ELSE v_sa:=r_1.sala+100; END IF; UPDATE emp; SET sala=v_sa WHERE CURRENT OF c1; END LOOP; END
如果不行,就把to_char(to_date('2007-8-1','yyyy-mm-dd'),'yyyymm')-to_char(indate,'yyyymm'))>=0这种语句的to_char函数去掉
你试试。
CREATE OR REPLACE PROCEDURE RAISE_PAY
AS
CURSOR CUR IS SELECT * FROM EMP;--定义邮标
EM EMP%ROWTYPE;--定义行变量
BEGIN
OPEN CUR;
LOOP
FETCH CUR INTO EM;
EXIT WHEN CUR%NOTFOUND;
IF (TO_DATE('2006-1-1','YYYY-MM-DD')-EM.INDATE>=0) THEN
EM.SALA:=EM.SALA+300; --2006年之前入职的员工工资加300
ELSIF(TO_DATE('2007-1-1','YYYY-MM-DD')-EM.INDATE<=0) AND (TO_DATE('2008-1-1','YYYY-MM-DD')-EM.INDATE>0) THEN
EM.SALA:=EM.SALA+200;--2007年入职的员工工资加200
ELSE EM.SALA:=EM.SALA+100;--其余员工工资加100
END IF;
UPDATE EMP SET SALA=EM.SALA WHERE EMP.STAFFNO=EM.STAFFNO;
END LOOP;
CLOSE CUR;
ROLLBACK
END RAISE_PAY;
--在COMMAND WINDOW中测试存储过程
SQL> SELECT * FROM EMP;--执行存储过程前表数据如下 STAFFNO SALA INDATE
---------- ---------- -----------
251072 2000 2005-7-4 10
251071 2000 2007-1-1 10
251070 2000 2007-7-4 10
251076 2000 2008-1-1 10SQL> EXEC RAISE_PAY;--执行存储过程PL/SQL procedure successfully completedSQL> SELECT * FROM EMP;;--存储过程执行后表数据如下 STAFFNO SALA INDATE
---------- ---------- -----------
251072 2300 2005-7-4 10 --SALA加300
251071 2200 2007-1-1 10 --SALA加200
251070 2200 2007-7-4 10 --SALA加200
251076 2100 2008-1-1 10 --SALA加100SQL>
--------------------------------------------------------
CREATE OR REPLACE PROCEDURE RAISE_PAY
AS
CURSOR CUR IS SELECT * FROM EMP;--定义邮标
EM EMP%ROWTYPE;--定义行变量
BEGIN
OPEN CUR;
LOOP
FETCH CUR INTO EM;
EXIT WHEN CUR%NOTFOUND;
IF (TO_DATE('2006-1-1','YYYY-MM-DD')-EM.INDATE>=0) THEN
EM.SALA:=EM.SALA+300; --2006年之前入职的员工工资加300
ELSIF(TO_DATE('2007-1-1','YYYY-MM-DD')-EM.INDATE <=0) AND (TO_DATE('2008-1-1','YYYY-MM-DD')-EM.INDATE>0) THEN
EM.SALA:=EM.SALA+200;--2007年入职的员工工资加200
ELSE EM.SALA:=EM.SALA+100;--其余员工工资加100
END IF;
UPDATE EMP SET SALA=EM.SALA WHERE EMP.STAFFNO=EM.STAFFNO;
END LOOP;
CLOSE CUR;
--ROLLBACK ------------------此行多余
END RAISE_PAY;
set sala = (case
when indate < TO_DATE('2006-01-01', 'YYYY-MM-DD') then sala + 300
when indate < TO_DATE('2007-01-01', 'YYYY-MM-DD') then sala + 200
else sala + 100 end)
Is
CURSOR cur IS SELECT indate, sala FROM T_EMP
FOR UPDATE OF sala;
BEGIN
FOR v_emp IN cur LOOP
UPDATE T_EMP
SET sala = Case
When indate < to_date('20060101','yyyymmdd') then sala + 300
When indate between to_date('20070101','yyyymmdd') and to_date('20071231','yyyymmdd') then sala + 200
Else sala + 100
End
WHERE CURRENT OF cur;
END LOOP; END sala_raise;
没跑题吧?
AS
CURSOR CUR IS SELECT * FROM EMP;--定义邮标
EM EMP%ROWTYPE;--定义行变量
BEGIN
OPEN CUR;
LOOP
FETCH CUR INTO EM;
EXIT WHEN CUR%NOTFOUND;
IF (TO_DATE('2006-1-1','YYYY-MM-DD')-EM.INDATE>=0) THEN
EM.SALA:=EM.SALA+300; --2006年之前入职的员工工资加300
ELSIF(TO_DATE('2007-1-1','YYYY-MM-DD')-EM.INDATE <=0) AND (TO_DATE('2008-1-1','YYYY-MM-DD')-EM.INDATE>0) THEN
EM.SALA:=EM.SALA+200;--2007年入职的员工工资加200
ELSE EM.SALA:=EM.SALA+100;--其余员工工资加100
END IF;
UPDATE EMP SET SALA=EM.SALA WHERE EMP.STAFFNO=EM.STAFFNO;
END LOOP;
CLOSE CUR;
ROLLBACK
END RAISE_PAY;
is
cursor c is select * from emp for update;
begin
for v_temp in c loop
if(v_temp.indate > to_date('2006-01-01','YYYY-MM-DD') and v_temp.indate < to_date('2007-01- 01','YYYY-MM-DD')) then
update emp set sala=(sala+300) where current of c;
elsif(v_temp.indate > to_date('2007-01-01','YYYY-MM-DD') and v_temp.indate < to_date('2008-01- 01','YYYY-MM-DD')) then
update emp set sala=(sala+200) where current of c;
else
update emp set sala=(sala+100) where current of c;
end loop;
end;