因小弟刚刚接触oracle,在程序开发中需要用到下面的存储过程,在线求大家写一个,谢谢!
EMP雇员表中有staffno(工号),sala(薪水),indate(入职日期)3个字段。请编写一个存储过程,给2006年前入职的员工加薪300元,给2007年入职的员工加薪200元,其他员工加薪100元(要求用游标实现)

解决方案 »

  1.   

    记得以前有人问过同样的问题
    我的回答是,此问题根本不需要存储过程,一句UPDATE就行了
    如果你实在要,翻我以前回答的贴子吧
      

  2.   

    如果可以不用存储过程和游标,简单地如下处理:
    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;
      

  3.   

    DELCARE  CURSOR c1 IS SELECT indate,salary  FROM emp   FOR UPDATE OF salary;  v_sa NUMBER(10,2);  BEGIN  
       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函数去掉
    你试试。
      

  4.   

    如果你要用存储过程的话,也可以就用UPDATE实现,不需要采用游标。
      

  5.   

    如果用游标的话感觉还挺麻烦的,UPDATE更简单些
      

  6.   

    --下面是存储过程原代码,经过测试功能正确
    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> 
      

  7.   

    --不好意思,不小心多粘贴了一行,存储过程应为:
    --------------------------------------------------------
    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; 
      

  8.   

    update EMP_employee
    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) 
      

  9.   

    Create Or Replace Procedure sala_raise 
    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;
    没跑题吧?
      

  10.   

    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; 
      

  11.   

    跟一个,电脑上没ORACLE,没测试...遍历游标有for简单些,不用开关cursor,update 可以根据目前cursor的指针where current of c,我是学的oracle10g,不知道其他版本是不是一样:create or replace procedure p
    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;