表 emp
last_name 
employee_id
hire_date
department_id表 dept
department_id
salary
job_id请教如何创建存储过程在表dept扩张一字段(name(varchar2(20)),利用游标将表emp last_name字段数据更新到新加的字段name中。

解决方案 »

  1.   

    一个dept对应多个emp,也就是一个department_id 有多个emp last_name,你要怎么处理?
      

  2.   

    就是说,dept表的新加字段name,也就是last_nam,内容需要跟emp表中的last_name一致
      

  3.   

    你的表达,呵呵。
    你能保证一个department_id,在emp里只有一个last_name?
    若有多个last_name,问你怎么存储,以,隔开,还是怎么处理。
      

  4.   

    不好意思,连接字段是department_id.假设唯一,没用重复
      

  5.   

    这两个表结构看起来很奇怪..
    假设是一一对应的话,
    alter table dept add name varchar2(20);
    update dept a set name=
    (select last_name from emp where department_id=a.department_id);
      

  6.   

    有点晕炫。
    如果dept与emp 1:1关系,拆表毫无意义。
    而更新也不必存储过程,直接SQL搞掂。
      

  7.   


    确实有点怪可能是job_id连到某个别得表,然后那个表得dep_id跟这个连可能不是楼主说的一一对应。
      

  8.   

    我的问题类似这个:
    create table T_USER 

    userID int, 
    userName varchar(48), 
    orgID int 

    go 
    create table T_USER_ROLE 

    userID int, 
    roleID int 

    --写一个存储过程,将表T_USER_ROLE扩展一个字段userName类型为varchar(48),然后用游标将T_USER的userName字段中的数据更新到T_USER_ROLE的userName字段中。 
      

  9.   


    噢,这个合理,呵呵,用狂浪那两句就够了,用不着游标。
    非要存储过程加游标得话,参考下:
    create or replace procedure addColSyncName
    as
    v_cur sys_refcursor;
    v_rec T_USER%ROWTYPE;
    begin
    begin
    execute immediate 'alter table T_USER_ROLE add userName varchar2(48)';
    commit;
    exception when others then --已有对应列名,不管
    null;
    end;
    open v_cur for select * from T_USER;
    loop
    fetch v_cur into v_rec;
    exit when v_cur%NOTFOUND;
    begin
    execute immediate 'update T_USER_ROLE set userName = '''||v_rec.userName||''' where userId = '||v_rec.userId;
    exception when NO_DATA_FOUND then --无对应userID,不管
    null;
    end;
    end loop;
    close v_cur;
    commit;
    end;
    /
      

  10.   

    感谢crazylaa,以后还请多指教