现在有两个用户A和B,用户A下的表是用户B下表的子集,现在每天需要执行的操作是:将B用户表中符合一定查询条件的数据插入A用户的表中,A用户下表的个数并不固定,以后可能增加或删除,但总是符合是B用户下表的子集。我的思路是:
遍历A用户下的所有表,并从通过dblink从B用户下同名的表中获取数据插入,求教这个过程该怎么写?Oracle遍历

解决方案 »

  1.   

    这很简单。 
    dba_tables,dba_tab_columns,以及动态语句可以解决。剩下的就是简单的循环控制逻辑。
    类似作用的视图也可以完成这些功能。
      

  2.   

    这必须借助用户视图和动态语句才能实现。我的想法是,利用dba用户先把用户a的所有的表查出来,利用游标进行保存。然后逐个循环的查出每个表名后,用动态语句来实现表与表之间的插入数据。
      

  3.   


    CREATE OR REPLACE PACKAGE PKG_temp is
    TYPE T_CURSOR IS REF CURSOR;
    procedure pro_get_all(CUR_OUT OUT T_CURSOR);
    END PKG_temp;
    CREATE OR REPLACE PACKAGE BODY PKG_temp
    is
    procedure pro_get_all(CUR_OUT OUT T_CURSOR) is
    v_col_list varchar2(500):='';
    v_tab_str  varchar2(500):='';
    begin
    FOR tb IN (SELECT table_name FROM user_tables) LOOP
      v_tab_str:=tb.table_name||','||v_tab_str;
      v_col_list:='';
      FOR col IN (select column_name from user_tab_cols where table_name =tb.table_name ) LOOP
          v_col_list:=col.column_name||','||v_col_list;
      END LOOP;
      /*dbms_output.put_line(v_col_list);*/
      execute immediate 'insert into '||tb.table_name||'@dblink_sjl select * from '|| tb.table_name;
      commit;
      open CUR_OUT for 'select 1 from dual';
    END LOOP;
    end;
    END PKG_temp;好吧,大致代码我是这么写的结贴送分