create procedure pro
as
cursor t_sor is
select b.职工编号,(select 基本工资 from zc0000 a where a.职称编号=b.职称编号) 基本工资 from emp000 b;
begin
for v_sor in t_sor loop
update grgzxx set 基本工资=v_sor.基本工资 where 职工编号=v_sor.职工编号;
if sql%rowcount=0 then
insert into grgzxx values (sysdate,v_sor.职工编号,v_sor.基本工资);
end if;
end loop;
end;
/

解决方案 »

  1.   

    简单写一个吧,思路很简单。
    首先选出职工信息在个人工资信息表中不存在的记录,将个人信息和工资插入到个人工资信息表中。
    然后再更新出工信息已经存在于个人工资信息表演中的基本工资就行了,至于查询你自己优化吧,我为了方便使用了子查询。create or replace procedure simpleProcedure is
          cursor v_emp_exists is select emp000.Ö°¹¤±àºÅ,emp000.Ö°Îñ±àºÅ,zc0000.»ù±¾¹¤×Ê 
          from emp000,zc0000
          where emp000.Ö°¹¤±àºÅ not in(select Ö°¹¤±àºÅ from grgzxx);
          cursor v_emp_notExists is select emp000.Ö°¹¤±àºÅ,emp000.Ö°Îñ±àºÅ,zc0000.»ù±¾¹¤×Ê 
          from emp000,zc0000
          where emp000.Ö°¹¤±àºÅ in(select Ö°¹¤±àºÅ from grgzxx);
                
    begin
         open v_emp_exists;
         --²åÈëÐÂÔöÔ±¹¤µÄ¹¤×Ê
         loop
           fetch v_emp_exists into v_emp;
           exit when v_emp_exists%notfound;
           insert into grgzxx(µÇ¼ÇÄêÔÂ,Ö°¹¤±àºÅ,»ù±¾¹¤×Ê) values(sysdate,v_emp.Ö°¹¤±àºÅ,v_emp.»ù±¾¹¤×Ê);
         end loop;
         close v_emp_exists;
         open v_emp_notExists;
         --¸üÐÂÔ­À´Ô±¹¤µÄ¹¤×Ê
         loop
             fetch v_emp_notExists into v_emp;
             exit when v_emp_notExists%notfound;
             update grgzxx set »ù±¾¹¤×Ê= v_emp.»ù±¾¹¤×Ê where Ö°¹¤±àºÅ= v_emp.Ö°¹¤±àºÅ;
         end loop;
         close v_emp_notExists;
    end simpleProcedure;
      

  2.   

    create or replace procedure simpleProcedure is
          cursor v_emp_exists is select emp000.职工编号,emp000.职务编号,zc0000.基本工资 
          from emp000,zc0000
          where emp000.职工编号 not in(select 职工编号 from grgzxx);
          cursor v_emp_notExists is select emp000.职工编号,emp000.职务编号,zc0000.基本工资 
          from emp000,zc0000
          where emp000.职工编号 in(select 职工编号 from grgzxx);
                
    begin
         open v_emp_exists;
         --插入新增员工的工资
         loop
           fetch v_emp_exists into v_emp;
           exit when v_emp_exists%notfound;
           insert into grgzxx(登记年月,职工编号,基本工资) values(sysdate,v_emp.职工编号,v_emp.基本工资);
         end loop;
         close v_emp_exists;
         open v_emp_notExists;
         --更新原来员工的工资
         loop
             fetch v_emp_notExists into v_emp;
             exit when v_emp_notExists%notfound;
             update grgzxx set 基本工资= v_emp.基本工资 where 职工编号= v_emp.职工编号;
         end loop;
         close v_emp_notExists;
         commit;
    end simpleProcedure;
    /
      

  3.   


      唉,又笨了,你用:beckhambobo(beckham) 的那个就可以了。
      
      用 %rowcount 可以得到最近操作影响的行,我居然不知道用上。   算了,不要分了。
      

  4.   

    for v_sor in t_sor loop 这句话是什么意思啊?
    V_sor在该存贮过程中并没有定义
    帮忙解释一下
      

  5.   

    beckhambobo(beckham) 的存贮过程在PL/SQL下执行,出现如下错误
     警告: 创建的过程带有编译错误。
      

  6.   

    可能你的版本低,改用以下语句:
    cursor t_sor is
    select b.职工编号,a.基本工资 from  zc0000 a,emp000 b where a.职称编号=b.职称编号;
      

  7.   

    oracle8.17
    改过之后仍出去相同的告警提示
      

  8.   

    楼主可用pl/sql developer工具调试,看哪里的错
      

  9.   

    cursor t_sor is
    select b.职工编号,(select 基本工资 from zc0000 a where a.职称编号=b.职称编号) 基本工资 from emp000 b;可以写成:
    cursor t_sor is
    select b.职工编号,a.基本工资 from emp000 b,zc0000 a where a.职称编号=b.职称编号;试试看吧。
      

  10.   


    自己也要先去try一下嘛
    这样才会有锻炼嘛