ITPub博客

首页 > 数据库 > Oracle > 生成某一用户下所有表数据的insert语句

生成某一用户下所有表数据的insert语句

Oracle 作者:壹頁書 时间:2013-12-28 11:17:36 0 删除 编辑
转自王工的博客
http://blog.csdn.net/wzy0623/article/details/8445228

功能:生成某一用户下所有数据表数据的insert语句,放入d:\insert.sql文件。

限制:只支持number、char、varchar2、date、long、clob数据类型。

提示:数据量小还可以,大了就别用这种方式了,会很慢。



CREATE OR REPLACE DIRECTORY mydir AS 'C:\';  
 
DECLARE  
  ROW_NUMBER   NUMBER := 0;  
  col_str      VARCHAR2 (32767) := '';  
  select_str   VARCHAR2 (32767) := '';  
  ins_tab      DBMS_SQL.varchar2_table;  
  l_count      INT := 0;  
  log_file     UTL_FILE.file_type;  
BEGIN  
  log_file := UTL_FILE.fopen ('MYDIR', 'insert.sql', 'w');  
  UTL_FILE.put_line (log_file, 'set define off;');  
 
  FOR x IN (SELECT table_name FROM user_tables)  
  LOOP  
     EXECUTE IMMEDIATE 'select count(*) from ' || x.table_name  
        INTO ROW_NUMBER;  
 
     IF ROW_NUMBER > 0  
     THEN  
        col_str := '';  
        select_str := '';  
 
        FOR y IN (  SELECT column_name, data_type  
                      FROM user_tab_columns  
                     WHERE table_name = x.table_name AND data_type != 'BLOB'  
                  ORDER BY column_id)  
        LOOP  
           col_str := col_str || y.column_name || ',';  
 
           IF y.data_type = 'NUMBER'  
           THEN  
              select_str :=  
                    select_str  
                 || 'decode('  
                 || y.column_name  
                 || ',null,''null'','  
                 || y.column_name  
                 || ')||'',''||';  
           ELSE  
              IF y.data_type IN ('CHAR', 'VARCHAR2', 'LONG', 'CLOB')  
              THEN  
                 select_str :=  
                       select_str  
                    || 'decode('  
                    || y.column_name  
                    || ',null,''null'',''''''''||replace('  
                    || y.column_name  
                    || ','''''''','''''''''''')||'''''''')||'',''||';  
              ELSE  
                 IF y.data_type = 'DATE'  
                 THEN  
                    select_str :=  
                          select_str  
                       || 'decode('  
                       || y.column_name  
                       || ',null,''null'',''to_date(''''''||'  
                       || 'to_char('  
                       || y.column_name  
                       || ',''yyyy-mm-dd hh24:mi:ss'')||'''  
                       || '''||'''''',''''yyyy-mm-dd hh24:mi:ss'''')'')||'',''||';  
                 END IF;  
              END IF;  
           END IF;  
        END LOOP;  
 
        col_str := 'insert into ' || x.table_name || ' (' || col_str;  
        col_str := SUBSTR (col_str, 1, LENGTH (col_str) - 1) || ') values (';  
        select_str :=  
              'select '''  
           || col_str  
           || ''' ||'  
           || SUBSTR (select_str, 1, LENGTH (select_str) - 7)  
           || '|| '');'' from '  
           || x.table_name;  
 
        -- dbms_output.put_line(select_str);  
        EXECUTE IMMEDIATE select_str BULK COLLECT INTO ins_tab;  
 
        l_count := ins_tab.COUNT;  
        UTL_FILE.put_line (log_file, '');  
        UTL_FILE.put_line (log_file, '-- table name: ' || x.table_name);  
 
        FOR i IN 1 .. l_count  
        LOOP  
           UTL_FILE.put_line (log_file, ins_tab (i));  
        END LOOP;  
     END IF;  
  END LOOP;  
 
  UTL_FILE.put_line (log_file, '');  
  UTL_FILE.put_line (log_file, 'commit;');  
  UTL_FILE.fclose (log_file);  
END;  
/  


注意王工博客代码的75行,有个笔误,少了两个  '   符号。
  || '|| ''); from '  
应为
  || '|| '');'' from '  


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1065181/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339872