我查询到了若干记录行,保存在表变量中,然后针对这些记录,进行一系列更新和插入。
下面红色的代码就是我的意图,但是这么写是不行的,因为表变量不被当作一个表。请问有什么办法可以实现这样的需求?(除了用全局临时表之外,那个比较复杂)declare
TYPE emp_table_type is table of tbl_emp.n_emp_id%type INDEX BY BINARY_INTEGER;
   emptable emp_table_type;
   begin
select n_emp_id bulk collect into emptable from tbl_emp where n_emp_id=999;
insert tableA select * from emptable;
update tableB set xx=xx where id in (select n_emp_id from emptable);
end;

解决方案 »

  1.   

    forall i in 1..emptable.count
    begin
    insert into tableA values (emptable(i));
    update tableB set xxx=xxx where id=emptable(i);
    end;
    commit;
    把这个语句跟你的那红色部分替换掉!
    测试下,我不确定不会报错
      

  2.   

    --好像用法是这样的,不能直接使用吧,没有环境,你试下吧!
    declare
    TYPE emp_table_type is table of tbl_emp.n_emp_id%type INDEX BY BINARY_INTEGER;
      emptable emp_table_type;
      begin
    select n_emp_id bulk collect into emptable from tbl_emp where n_emp_id=999;
    --dbms_output.put_line(emptable(0).n_emp_id);
    for i in 1..emptable.count() loop
      insert tableA(id) vlaues(emptable(i).n_emp_id);
      update tableB set xx=xx where id =emptable(i).n_emp_id;
    end loop;
    end;
      

  3.   

    declare 
    TYPE emp_table_type is table of tbl_emp.n_emp_id%type INDEX BY BINARY_INTEGER; 
    emptable emp_table_type; 
    begin 
      select n_emp_id bulk collect into emptable from tbl_emp where n_emp_id=999; 
      for i in 1..emptable.count() 
      loop 
        insert INTO tableA(id) VALUES(emptable(i)); 
        update tableB set xx=xx where id =emptable(i); 
      end loop;
    end;
      

  4.   

    如果在PL/SQL中,就使用数组罢。
    如果不在,就手动创建一个table罢。
      

  5.   

    各位提供的方法都是循环这个变量,这样当然可以,但问题是这样逐条插入和更新性能很差。
    如果能够像取一张表一样insert xxx select xxx,会好很多。
    不知道有没有别的思路?
      

  6.   

    表变量主要用于循环操作。集合变量。或者
    你的需要根本不要定义表变量。
    insert into tableA select n_emp_id from tbl_emp where n_emp_id=999;
    update tableB set xx=xx where id in (select n_emp_id from tbl_emp where n_emp_id=999
    );