提供了根据表中的数据自动生成insert语句的数据库包,还提供了一些简单的工具

/*某些原因,删了一些自己用的函数,此包是我每次导数据老是用工具,如果要导特定几张表的话,如果用工具导入每次都找的够呛,所以花了一点时间写了此过程,如果发现问题或好的建议可以给我留言或者邮箱myrocket_2003@163.com

  使用方法分为写文件和写表的方式,写文件需要先创建directory并需要相应的权限,写表则需要首先创建basedata表和seq_basedata序列

 

  过程里面支持类型有number ,char,varchar2,date,如果有其他类型,请自己在过程里面添加,不支持大字段,对象类型,呵呵

  调用过程也可以写在包里面,然后可以直接调用

*/

 

 

 

 

 

 

-----------------------------------------------
-- Export file for user SCOTT                --
-- Created by lihong on 2009-09-13, 21:47:44 --
-----------------------------------------------

spool pkg_comm.log

prompt
prompt Creating package PKG_COMM
prompt =========================
prompt
create or replace package pkg_comm
as
  /*
  需要显式的给此用户赋予 权限
  如grant create table to adc;
  */
  e_error Exception;

  type t_getvalue is table of varchar2(5000)
  index by binary_integer;

  type t_getinserts is table of varchar2(30000)
  index by binary_integer;

  type t_ngetvalue is table of varchar2(5000)
  index by binary_integer;

  type t_ngetinserts is table of varchar2(10000)
  index by binary_integer;

  /*
    获得字符串的分隔符的前部分
    select func_getleft('abcdefg',3) from dual
    返回abc
  */
  function func_getleft(
                        p_str varchar2,
                        p_len number
                        )return varchar2;

  function func_ngetleft(
                        p_str nvarchar2,
                        p_len number
                        )return nvarchar2;

  /*
    获得字符的从右边开始的部分
    select func_getright('abcde',3) from dual
    返回  cde
  */
  function func_getright(
                         p_str varchar2,
                         p_len number
                         )return varchar2;

  function func_ngetright(
                         p_str nvarchar2,
                         p_len number
                         )return nvarchar2;

  /*
    获得最后一部分字符串
    select func_getlastpart('/abc/def/ghi','/') from dual;
    得到 ghi
  */
  function func_getlastpart(
                            p_str varchar2, --字符
                            p_dot varchar2-- 分隔符
                            ) return varchar2;

  function func_ngetlastpart(
                            p_str nvarchar2, --字符
                            p_dot nvarchar2-- 分隔符
                            ) return nvarchar2;

  /*
    获得字符串分隔符前面的字符串
    如:  abc/de  得到 abc
  */
  function func_getpriopart(
                            p_str varchar2, --字符
                            p_dot varchar2-- 分隔符
                           )return varchar2;

  function func_ngetpriopart(
                            p_str nvarchar2, --字符
                            p_dot nvarchar2-- 分隔符
                           )return nvarchar2;

  /*
    分离字符串  如'ab,cde,fgh,i' 分割为'ab'  'cde'  'fgh'  'i'
  */
  function func_getvalue(
                         p_str varchar2, --字符串
                         p_sign varchar2  --分隔符
                        ) return t_getvalue;


  function func_ngetvalue(
                         p_str nvarchar2, --字符串
                         p_sign nvarchar2  --分隔符
                        ) return t_ngetvalue;


  /*
    根据表名获得insert语句
  */
  function func_getinserts(
                         p_tablename varchar2,
                         p_where varchar2:=' where 1=1'
                         )return t_getinserts;

  function func_ngetinserts(
                         p_tablename nvarchar2,
                         p_where nvarchar2:=' where 1=1'
                         )return t_ngetinserts;

  /*
    将表中的数据打印成文本
    调用前须确保以 sys登陆,create or replace directory aim_dir as '/home/oracle';
    grant write on directory aim_dir to adc
    做完后才可以调用此过程,调用的时候应该注意路径为大写
    现在只提供每次一张表,如果打印多张表的请用p_writetext过程

    将表中的数据打印成文本 p_type in ('append','write')
  */
  procedure p_writetext(
                         p_path varchar2,
                         p_filename varchar2,
                         p_tablename varchar2,
                         p_where varchar2:=' where 1=1',
                         p_type varchar2,
                         p_errid out int
                        );

 

  /*
    将多个表一起打印成文本
  */
  procedure p_writetext(
                         p_path varchar2,
                         p_filename varchar2,
                         p_tablename varchar2,
                         p_dot varchar2,
                         p_errid out int
                        );

 

  --取得序列
  function func_getnumber(
                          p_name varchar2
                          ) return int;


  /*根据表名取得表的所有字段*/
  function func_getFields(
                          p_tablename varchar2
                          )return varchar2;

  /*根据表名取得表的select语句,根据此语句可以取得表的值*/
  function func_getvalues(
                          p_tablename varchar2,
                          p_where varchar2
                          )return varchar2;

  function func_ngetvalues(
                          p_tablename nvarchar2,
                          p_where nvarchar2
                          )return nvarchar2;

 

  /*
    备份本地所有表到文件
    注意运行此过程应该假设已经有read directory,write directory的权限
    具体权限设置请参照p_writetext里面的说明

    P_condition 含义是每张表里面的小于等于此数据的记录数才备份,如果为0 则备份所有的记录
  */
  procedure p_exporttotext(
                           p_path varchar2,
                           P_condition int,
                           p_errid out int
                          );

  /*
    备份自己手工加的表,表名组成为:用户名_数据库名_日期
  */
  procedure p_exportself(
                         p_path varchar2,
                         p_tablename varchar2,
                         p_dot varchar2,
                         p_errid out int
                        );

 

 

  procedure p_writesql(
                        p_tablename nvarchar2,
                        p_where nvarchar2:=' where 1=1',
                        p_errid out int
                        );


  procedure p_writesqls(
                        p_tablename nvarchar2,
                        p_dot nvarchar2,
                        p_errid out int
                        );

end pkg_comm;
/

prompt
prompt Creating package body PKG_COMM
prompt ==============================
prompt
create or replace package body pkg_comm
as

  /*
    获得字符串的分隔符的前部分
    select pkg_comm.func_getleft('abcdefg',3) from dual
    返回abc
  */
  function func_getleft(
                        p_str varchar2,
                        p_len number
                        )
  return varchar2
  as
  begin
    if p_len>length(p_str)  then
      return p_str;
    end if;
    if p_len<=0 then
      return '';
    end if;
    return substr(p_str,1,p_len);
  exception
    when others then
      return p_str;
  end;

  function func_ngetleft(
                        p_str nvarchar2,
                        p_len number
                        )
  return nvarchar2
  as
  begin
    if p_len>length(p_str)  then
      return p_str;
    end if;
    if p_len<=0 then
      return '';
    end if;
    return substr(p_str,1,p_len);
  exception
    when others then
      return p_str;
  end;


  /*
    获得字符的从右边开始的部分
    select pkg_comm.func_getright('abcde',3) from dual
    返回  cde
  */
  function func_getright(
                         p_str varchar2,
                         p_len number
                         )
  return varchar2
  as
    l_tmp varchar2(30000);
  begin
    if p_len>length(p_str)  then
      return p_str;
    end if;
    if  p_len<=0 then
      return '';
    end if;

    select reverse(substr(reverse(p_str),1,p_len)) into l_tmp from dual;
    return l_tmp;
  exception
    when others then
    return p_str;
  end;

  function func_ngetright(
                         p_str nvarchar2,
                         p_len number
                         )
  return nvarchar2
  as
    l_tmp nvarchar2(10000);
  begin
    if p_len>length(p_str)  then
      return p_str;
    end if;
    if  p_len<=0 then
      return '';
    end if;

    select reverse(substr(reverse(p_str),1,p_len)) into l_tmp from dual;
    return l_tmp;
  exception
    when others then
    return p_str;
  end;

  /*
    获得最后一部分字符串
    select pkg_comm.func_getlastpart('/abc/def/ghi','/') from dual;
    得到 ghi
  */
  function func_getlastpart(
                            p_str varchar2, --字符
                            p_dot varchar2-- 分隔符
                            )
  return varchar2
  as
    l_tmp varchar2(300);
    l_dot varchar2(10);
  begin
    l_dot:=trim(p_dot);

    if l_dot is null then
     return p_str;
    end if;

    if instr(p_str,l_dot)=0 then
      return p_str;
    end if;
    select reverse(pkg_comm.func_getleft(reverse(p_str),instr(reverse(p_str),reverse(l_dot))-1)) into l_tmp from dual;
    return l_tmp;
  exception
    when others then
      return p_str;
  end;

  function func_ngetlastpart(
                            p_str nvarchar2, --字符
                            p_dot nvarchar2-- 分隔符
                            )
  return nvarchar2
  as
    l_tmp nvarchar2(300);
    l_dot nvarchar2(10);
  begin
    l_dot:=trim(p_dot);

    if l_dot is null then
     return p_str;
    end if;

    if instr(p_str,l_dot)=0 then
      return p_str;
    end if;
    select reverse(pkg_comm.func_ngetleft(reverse(p_str),instr(reverse(p_str),reverse(l_dot))-1)) into l_tmp from dual;
    return l_tmp;
  exception
    when others then
      return p_str;
  end;

  /*
    获得字符串分隔符前面的字符串
    如:  abc/de  得到 abc
     select pkg_comm.func_getlastpart('abc/de','/') from dual;
  */
  function func_getpriopart(
                            p_str varchar2, --字符
                            p_dot varchar2-- 分隔符
                           )
  return varchar2
  as
    l_tmp varchar2(300);
    l_dot varchar2(10);
  begin
    l_dot:=trim(p_dot);

    if l_dot is null then
      return p_str;
    end if;
    if instr(p_str,l_dot)=0 then
      return p_str;
    end if;

    select pkg_comm.func_getleft( p_str,instr(p_str,l_dot)-1) into l_tmp from dual;
    return l_tmp;
  exception
    when others then
      return p_str;
  end;

  function func_ngetpriopart(
                            p_str nvarchar2, --字符
                            p_dot nvarchar2-- 分隔符
                           )
  return nvarchar2
  as
    l_tmp nvarchar2(300);
    l_dot nvarchar2(10);
  begin
    l_dot:=trim(p_dot);

    if l_dot is null then
      return p_str;
    end if;
    if instr(p_str,l_dot)=0 then
      return p_str;
    end if;

    select pkg_comm.func_ngetleft( p_str,instr(p_str,l_dot)-1) into l_tmp from dual;
    return l_tmp;
  exception
    when others then
      return p_str;
  end;


  /*
    分离字符串  如'ab,cde,fgh,i' 分割为'ab'  'cde'  'fgh'  'i'
    declare
      l_facttable pkg_comm.t_getvalue;
      l_index int;
    begin
      l_facttable:=pkg_comm.func_getvalue('a->b->c->d,e','->');
      l_index:=l_facttable.first;
      loop
        exit when l_index is null;
        if l_facttable(l_index)is not null then
          dbms_output.put_line(l_facttable(l_index));
        end if;
        exit when l_index=l_facttable.last;
        l_index:=l_facttable.next(l_index);
      end loop;
    end;
  */
  function func_getvalue(
                         p_str varchar2, --字符串
                         p_sign varchar2  --分隔符
                        )
  return t_getvalue
  as
    l_facttable t_getvalue;
    l_pos number;
    l_value varchar(30000);
    l_low number;
    l_str varchar2(30000);
  begin
    l_low:=1;
    l_str:=p_str;
    l_pos:=instr(l_str,p_sign);
    while  l_pos<>0 loop
      l_value:=func_getleft(l_str,l_pos-1);
      l_str:=substr(l_str,l_pos+length(p_sign),length(l_str)-l_pos);
      l_pos:=instr(l_str,p_sign);
      l_facttable(l_low):=l_value;
      l_low:=l_low+1;
    end loop;
    l_facttable(l_low):=l_str;
    return l_facttable;
  end;


  function func_ngetvalue(
                         p_str nvarchar2, --字符串
                         p_sign nvarchar2  --分隔符
                        )
  return t_ngetvalue
  as
    l_facttable t_ngetvalue;
    l_pos number;
    l_value nvarchar2(10000);
    l_low number;
    l_str nvarchar2(10000);
  begin
    l_low:=1;
    l_str:=p_str;
    l_pos:=instr(l_str,p_sign);
    while  l_pos<>0 loop
      l_value:=func_ngetleft(l_str,l_pos-1);
      l_str:=substr(l_str,l_pos+length(p_sign),length(l_str)-l_pos);
      l_pos:=instr(l_str,p_sign);
      l_facttable(l_low):=l_value;
      l_low:=l_low+1;
    end loop;
    l_facttable(l_low):=l_str;
    return l_facttable;
  end;

 


  /*
    根据表名获得insert语句,
    暂时支持number,int,varchar2,char,date类型,其他类型暂时不支持
    特别要注意字符串里面不能有引号等特殊字符
    不支持含有大对象的表的导出
  */
  function func_getinserts(
                           p_tablename varchar2,
                           p_where varchar2:=' where 1=1'
                          )
  return t_getinserts
  as
    l_count int:=1;
    l_str varchar2(10000);
    type l_ref_cur is ref cursor;
    l_cur l_ref_cur;
    l_result varchar2(30000);
    l_getinsert t_getinserts;
    l_facttable t_getvalue;
    l_index int;
    l_fieldvalue varchar2(5000);
    l_flag boolean;
    l_values varchar2(30000);
  begin
    select count(*) into l_count from user_tab_columns
    where table_name=p_tablename and DATA_TYPE in ('CLOB','BLOB','LONG','LONG RAW','RAW','ROWID','UROWID');

    if l_count>0 then
      l_getinsert(1):='';
      return l_getinsert;
    end if;

    l_count:=1;
    l_str:=func_getvalues(p_tablename,p_where );
    open l_cur for l_str;
    loop
      fetch l_cur into l_result;
      exit when l_cur%notfound;
      /**************添加了对特殊字符的处理******************/
      l_values:='';
      l_facttable:=func_getvalue(l_result,chr(8));
      l_index:=l_facttable.first;
      loop
        exit when l_index is null;
        l_fieldvalue:=l_facttable(l_index);
        if l_fieldvalue is not null then
          l_flag:=false;
          if func_getleft(l_fieldvalue,1)='''' then
            l_fieldvalue:=func_getright(l_fieldvalue,length(l_fieldvalue)-1);
            l_flag:=true;
          end if;
          if func_getright(l_fieldvalue,1)='''' then
            l_fieldvalue:=func_getleft(l_fieldvalue,length(l_fieldvalue)-1);
            l_flag:=true;
          end if;

          if l_flag then
            l_fieldvalue:=replace(l_fieldvalue,'''','''''');
            l_fieldvalue:=''''||l_fieldvalue||'''';
          end if;
          l_values:=l_values||','||l_fieldvalue;

        end if;
        exit when l_index=l_facttable.last;
        l_index:=l_facttable.next(l_index);
      end loop;
      /********************************/

      if l_values is not null then
        l_values:=func_getright(l_values,length(l_values)-1);
      end if;
      l_str:='INSERT INTO '||p_tablename||' ('||func_getFields(p_tablename)
           ||') VALUES('||l_values||')';
      l_getinsert(l_count):=l_str;
      l_count:=l_count+1;
    end loop;
    close l_cur;
  --  dbms_output.put_line(l_count);
    return l_getinsert;
  exception
    when others then
      if l_cur%isopen then
        close l_cur;
      end if;
      raise;
      l_getinsert(1):='';
      return l_getinsert;
  end;

  function func_ngetinserts(
                           p_tablename nvarchar2,
                           p_where nvarchar2:=' where 1=1'
                          )
  return t_ngetinserts
  as
    l_count int:=1;
    l_str varchar2(10000);
    type l_ref_cur is ref cursor;
    l_cur l_ref_cur;
    l_result nvarchar2(10000);
    l_getinsert t_ngetinserts;
    l_facttable t_ngetvalue;
    l_index int;
    l_fieldvalue nvarchar2(5000);
    l_flag boolean;
    l_values nvarchar2(10000);
  begin
    select count(*) into l_count from user_tab_columns
    where table_name=p_tablename and DATA_TYPE in ('CLOB','BLOB','LONG','LONG RAW','RAW','ROWID','UROWID');

    if l_count>0 then
      l_getinsert(1):='';
      return l_getinsert;
    end if;

    l_count:=1;
    l_str:=func_ngetvalues(p_tablename,p_where );
    open l_cur for l_str;
    loop
      fetch l_cur into l_result;
      exit when l_cur%notfound;
      /**************添加了对特殊字符的处理******************/
      l_values:='';
      l_facttable:=func_ngetvalue(l_result,chr(8));
      l_index:=l_facttable.first;
      loop
        exit when l_index is null;
        l_fieldvalue:=l_facttable(l_index);
        if l_fieldvalue is not null then
          l_flag:=false;
          if func_ngetleft(l_fieldvalue,1)='''' then
            l_fieldvalue:=func_ngetright(l_fieldvalue,length(l_fieldvalue)-1);
            l_flag:=true;
          end if;
          if func_ngetright(l_fieldvalue,1)='''' then
            l_fieldvalue:=func_ngetleft(l_fieldvalue,length(l_fieldvalue)-1);
            l_flag:=true;
          end if;

          if l_flag then
            l_fieldvalue:=replace(l_fieldvalue,'''','''''');
            l_fieldvalue:=''''||l_fieldvalue||'''';
          end if;
          l_values:=l_values||','||l_fieldvalue;

        end if;
        exit when l_index=l_facttable.last;
        l_index:=l_facttable.next(l_index);
      end loop;
      /********************************/

      if l_values is not null then
        l_values:=func_ngetright(l_values,length(l_values)-1);
      end if;
      l_str:='INSERT INTO '||p_tablename||' ('||func_getFields(p_tablename)
           ||') VALUES('||l_values||')';
      l_getinsert(l_count):=l_str;
     -- dbms_output.put_line(substr(l_str,1,200));
      l_count:=l_count+1;
    end loop;
    close l_cur;
  --  dbms_output.put_line(l_count);
    return l_getinsert;
  exception
    when others then
      if l_cur%isopen then
        close l_cur;
      end if;
      raise;
      l_getinsert(1):='';
      return l_getinsert;
  end;

  /*
    将表中的数据打印成文本
    调用前须确保以 sys登陆,create or replace directory eidc_dir as '/home/oracle/ora_data_backup'
    grant read on directory eidc_dir  to adc
    grant write on directory eidc_dir  to adc
    做完后才可以调用此过程,调用的时候应该注意路径为大写
    现在只提供每次一张表,如果打印多张表的请用p_writetexts过程

    将表中的数据打印成文本 p_type in ('append','write')

     如果是append 的时候必须保证有此文件才能够append否则报错
  */
  procedure p_writetext(
                         p_path varchar2,
                         p_filename varchar2,
                         p_tablename varchar2,
                         p_where varchar2:=' where 1=1',
                         p_type varchar2,
                         p_errid out int
                        )
  as
    l_fileid utl_file.file_type;
    l_index int;
    l_getinserts t_getinserts;
    l_type char(1);
    l_count int;
  begin
    p_errid:=0;
    if upper(p_type)='WRITE' then
      l_type:='w';
    else
      l_type:='a';
    end if;
    l_count:=1;
    l_getinserts:=func_getinserts(p_tablename,p_where);
    l_fileid:=utl_file.fopen(p_path,p_filename,l_type,30000);
    l_index:=l_getinserts.first;
    loop
      exit when l_index is null;
      if l_count=1 then
        utl_file.put_line(l_fileid,'prompt 正在装载表'||p_tablename||'数据......');
      end if;

      if  l_getinserts(l_index) is not null then
        utl_file.put_line(l_fileid,l_getinserts(l_index)||';');
      end if;
      exit when l_index=l_getinserts.last;
      l_count:=l_count+1;
      l_index:=l_getinserts.next(l_index);
    end loop;

    utl_file.put_line(l_fileid,'commit;');
    utl_file.put_line(l_fileid,'prompt 共装载'||to_char(l_count)||'条记录');
    utl_file.fflush(l_fileid);
    utl_file.fclose(l_fileid);
  exception
    when others then
      if utl_file.is_open(l_fileid) then
        utl_file.fclose(l_fileid);
      end if;
      raise;
      p_errid:=sqlcode;
      raise;
      return;
  end;


  /*
    将多个表一起打印成文本,如果是多个表,请用割开符号隔开单个表直接写表名,
    此时打印的表为所有记录,如果有条件的记录,请到其他的过程去打印
  */
  procedure p_writetext(
                         p_path varchar2,
                         p_filename varchar2,
                         p_tablename varchar2,
                         p_dot varchar2,
                         p_errid out int
                        )
  as
   l_facttable pkg_comm.t_getvalue;
   l_index int;
   l_fileid utl_file.file_type;
   l_osuser varchar2(30);
   l_dbname varchar2(30);
   l_charset varchar2(60);
   l_tblname varchar2(30);
   l_client_charset varchar2(60);
  begin
    p_errid:=0;
    begin
      select sys_context('USERENV','os_user'),sys_context('USERENV','db_name'),sys_context('USERENV','LANGUAGE')
         into l_osuser,l_dbname,l_client_charset  from dual;
    exception
      when no_data_found then
        l_osuser:='';
        l_dbname:='';
        l_client_charset:='';
    end;
    select a.value||'_'||b.value||'.'||c.value charset
       into l_charset
     from nls_database_parameters a,
          nls_database_parameters b,
          nls_database_parameters  c
     where a.parameter='NLS_LANGUAGE'
         and b.parameter='NLS_TERRITORY'
         and c.parameter='NLS_CHARACTERSET';

    l_facttable:=func_getvalue(p_tablename,p_dot);

    l_fileid:=utl_file.fopen(p_path,p_filename,'w');
    utl_file.put_line(l_fileid,'prompt 创建时间:'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
    utl_file.put_line(l_fileid,'prompt 脚本创建人:'||l_osuser);
    utl_file.put_line(l_fileid,'prompt 数据库名:'||l_dbname);
    utl_file.put_line(l_fileid,'prompt 数据库字符集:'||l_charset);
    utl_file.put_line(l_fileid,'prompt 客户端字符集:'||l_client_charset);
    utl_file.put_line(l_fileid,'set feedback off;');
    utl_file.put_line(l_fileid,'set define off;');
    utl_file.put_line(l_fileid,'');


    l_index:=l_facttable.first;
    loop
      exit when l_index is null;
      l_tblname:=trim(replace(l_facttable(l_index),chr(10),' '));

      if l_tblname  is not null then
        utl_file.put_line(l_fileid,'prompt 删除表:'||l_tblname||'的数据');
        utl_file.put_line(l_fileid,'truncate table   '||l_tblname||'; ');
      --  dbms_output.put_line(l_facttable(l_index));
      end if;
      exit when l_index=l_facttable.last;
      l_index:=l_facttable.next(l_index);
    end loop;

    utl_file.fflush(l_fileid);
    utl_file.fclose(l_fileid);

    l_index:=l_facttable.first;
    loop
      exit when l_index is null;
      l_tblname:=trim(replace(l_facttable(l_index),chr(10),' '));
      if l_tblname is not null then
        dbms_output.put_line(l_facttable(l_index));
        p_writetext(p_path,p_filename,l_tblname,' where 1=1 ','append',p_errid);
      end if;
      exit when l_index=l_facttable.last;
      l_index:=l_facttable.next(l_index);
    end loop;

    l_fileid:=utl_file.fopen(p_path,p_filename,'a');
    utl_file.put_line(l_fileid,'set feedback on;');
    utl_file.put_line(l_fileid,'set define on;');
    utl_file.put_line(l_fileid,'prompt 装载数据完毕;');
    utl_file.fflush(l_fileid);
    utl_file.fclose(l_fileid);

  exception
    when others then
      if utl_file.is_open(l_fileid) then
        utl_file.fclose(l_fileid);
      end if;
      raise;
      p_errid:=sqlcode;
  end;

 


  --取得序列
  function func_getnumber(
                          p_name varchar2  --序列名称
                          )
  return int
  as
    l_str varchar2(1000);
    l_seqname varchar2(100);
    l_count int;
    l_result int;
  begin
    l_seqname:='pseq_'||p_name;

    l_str:='select object_name from user_objects '
         ||' where object_type=''SEQUENCE'' and status=''VALID'''
         ||' and object_name = upper('''||l_seqname||''')';

    select count(SEQUENCE_NAME) into l_count from user_sequences a
    where a.sequence_name =upper(l_seqname);

    if l_count=0 then
      l_str:='create sequence '||l_seqname||' increment   by   1
           start   with   1   nomaxvalue   nocycle   cache   10';

      execute immediate l_str;
    end if;

    l_str:='select '||rtrim(l_seqname)||'.nextval from dual';

    execute immediate l_str into l_result;

    return l_result;
  exception
    when others then
      return 0;
  end;

  --取得表的字段
  function func_getFields(
                          p_tablename varchar2
                          )
  return varchar2
  as
    l_result varchar2(1000);
  begin
    for l_field in (select COLUMN_NAME from  user_tab_columns
                     where TABLE_NAME=upper(p_tablename) order by COLUMN_ID) loop
       l_result:=l_result||','||l_field.COLUMN_NAME;
    end loop;

    if l_result is not null then
      return func_getright(l_result,length(l_result)-1);
    else
      return '';
    end if;
  exception
    when others then
      return '';
  end;

  --取得表的值
  function func_getvalues(
                          p_tablename varchar2,
                          p_where varchar2
                          )
  return varchar2
  as
  l_result varchar2(30000);
  l_tmp varchar2(30000);
  begin
    for l_field in (
      select 'decode( '||column_name ||' , null , ''NULL'' ,  '
                    ||decode(DATA_TYPE,'NUMBER',column_name,
                                       'INT',column_name,
                                        'CHAR',chr(39)||chr(39)||chr(39)||chr(39)||'||'||column_name||'||'||chr(39)||chr(39)||chr(39)||chr(39),
                                        'VARCHAR2',chr(39)||chr(39)||chr(39)||chr(39)||'||'||column_name||'||'||chr(39)||chr(39)||chr(39)||chr(39),
                                        'DATE','''to_date(''''''||to_char('||column_name||',''yyyy-mm-dd hh24:mi:ss'')||'||''''''',''''yyyy-mm-dd hh24:mi:ss'''')'''
                  )||' )' col_name
      from user_tab_columns
      where table_name=upper(p_tablename)
      order by column_id) loop
       l_result:=l_result||'||'||'chr(8)'||'||'||l_field.col_name;
    end loop;

    if l_result is not null then
      l_tmp:= func_getright(l_result,length(l_result)-10);
      l_result:='select '||l_tmp
             ||' from '||p_tablename||' '||p_where;
      return l_result;
    else
      return '';
    end if;
  exception
    when others then
      return '';
  end;


  function func_ngetvalues(
                          p_tablename nvarchar2,
                          p_where nvarchar2
                          )
  return nvarchar2
  as
  l_result nvarchar2(10000);
  l_tmp nvarchar2(10000);
  begin
    for l_field in (
      select 'decode( '||column_name ||' , null , ''NULL'' ,  '
                    ||decode(DATA_TYPE,'NUMBER',column_name,
                                       'INT',column_name,
                                        'CHAR',chr(39)||chr(39)||chr(39)||chr(39)||'||'||column_name||'||'||chr(39)||chr(39)||chr(39)||chr(39),
                                        'VARCHAR2',chr(39)||chr(39)||chr(39)||chr(39)||'||'||column_name||'||'||chr(39)||chr(39)||chr(39)||chr(39),
                                        'DATE','''to_date(''''''||to_char('||column_name||',''yyyy-mm-dd hh24:mi:ss'')||'||''''''',''''yyyy-mm-dd hh24:mi:ss'''')'''
                  )||' )' col_name
      from user_tab_columns
      where table_name=upper(p_tablename)
      order by column_id) loop
       l_result:=l_result||'||'||'chr(8)'||'||'||l_field.col_name;
    end loop;

    if l_result is not null then
      l_tmp:= func_ngetright(l_result,length(l_result)-10);
      l_result:='select '||l_tmp
             ||' from '||p_tablename||' '||p_where
             ||' order by 1';
      return l_result;
    else
      return '';
    end if;
  exception
    when others then
      return '';
  end;


  /*
    备份本地所有表到文件
    注意运行此过程应该假设已经有read directory,write directory的权限
    具体权限设置请参照p_writetext里面的说明

    如果有大对象的表备份不了,会跳过含有大对象的表

    P_condition 含义是每张表里面的小于等于此数据的记录数才备份,如果为0 则备份所有的记录
  */
  procedure p_exporttotext(
                           p_path varchar2,
                           P_condition int,
                           p_errid out int
                          )
  as
    l_count int;
    l_str varchar2(1000);
    l_tmpname varchar2(1000);
    l_tmpfilename varchar2(100);
  begin
    p_errid:=0;
    l_tmpfilename:='eidc'||to_char(sysdate,'yyyymmddhh24miss')||'.txt';
    for l_table in (select table_name from user_tables
                    where  table_name not in
                           (select table_name from user_tab_columns
                             where DATA_TYPE in ('BLOB','CLOB','LONG','LONG RAW'))) loop
      l_str:='select count(1)  from '||l_table.table_name||' ';
      execute immediate l_str into l_count;
      if P_condition<=0 then
        if l_count>0  then
          l_tmpname:=l_tmpname||','||l_table.table_name;
        end if;
      else
        if l_count>0 and l_count<=P_condition then
          l_tmpname:=l_tmpname||','||l_table.table_name;
        end if;
      end if;
    end loop;

    if l_tmpname is not null then
      l_tmpname:=pkg_comm.func_getright(l_tmpname,length(l_tmpname)-1);
      pkg_comm.p_writetext(p_path,l_tmpfilename,l_tmpname,',',P_ERRID);
      if p_errid<>0 then
        dbms_output.put_line('error');
      end if;
    end if;
  exception
    when others then
      p_errid:=sqlcode;
      raise;
      return;
  end;


  /*
    备份自己手工加的表,表名组成为:用户名_数据库名_日期
  */
  procedure p_exportself(
                         p_path varchar2,
                         p_tablename varchar2,
                         p_dot varchar2,
                         p_errid out int
                        )
  as
    l_osuser varchar2(30);
    l_tmpfilename varchar2(100);
  begin
    p_errid:=0;

    begin
      select sys_context('USERENV','os_user')
         into l_osuser  from dual;
    exception
      when no_data_found then
        l_osuser:='';
    end;

    l_tmpfilename:=l_osuser||'_N3'||'_eidc'||to_char(sysdate,'yyyymmddhh24miss')||'.txt';

    p_writetext(p_path,l_tmpfilename,p_tablename,p_dot,p_errid);
    if p_errid<>0 then
        dbms_output.put_line('error');
    end if;
  exception
    when others then
      p_errid:=sqlcode;
      raise;
      return;
  end;

 

 

 

  procedure p_writesql(
                       p_tablename nvarchar2,
                       p_where nvarchar2:=' where 1=1',
                       p_errid out int
                      )
  as
    l_index int;
    l_getinserts t_ngetinserts;
    l_count int;
  begin
    p_errid:=0;

    l_count:=1;
    l_getinserts:=func_ngetinserts(p_tablename,p_where);

    l_index:=l_getinserts.first;
    loop
      exit when l_index is null;
      if l_count=1 then
        insert into basedata values(seq_basedata.nextval,'prompt 正在装载表'||p_tablename||'数据......');
      end if;

      if  l_getinserts(l_index) is not null then
        insert into basedata values(seq_basedata.nextval,l_getinserts(l_index)||';');
      end if;
      exit when l_index=l_getinserts.last;
      l_count:=l_count+1;
      l_index:=l_getinserts.next(l_index);
    end loop;

    insert into basedata values(seq_basedata.nextval,'commit;');
    insert into basedata values(seq_basedata.nextval,'prompt 共装载'||to_char(l_count)||'条记录');
    commit;
  exception
    when others then
      raise;
      p_errid:=sqlcode;
      raise;
      return;
  end;

  procedure p_writesqls(
                        p_tablename nvarchar2,
                        p_dot nvarchar2,
                        p_errid out int
                        )
  as
   l_facttable pkg_comm.t_ngetvalue;
   l_index int;
   l_osuser nvarchar2(30);
   l_dbname nvarchar2(30);
   l_charset nvarchar2(60);
   l_tblname nvarchar2(30);
   l_str varchar2(100);
  begin
    p_errid:=0;
    begin
      select sys_context('USERENV','os_user'),sys_context('USERENV','db_name')
         into l_osuser,l_dbname  from dual;
    exception
      when no_data_found then
        l_osuser:='';
        l_dbname:='';
    end;
    select a.value||'_'||b.value||'.'||c.value charset
       into l_charset
     from nls_database_parameters a,
          nls_database_parameters b,
          nls_database_parameters  c
     where a.parameter='NLS_LANGUAGE'
         and b.parameter='NLS_TERRITORY'
         and c.parameter='NLS_CHARACTERSET';

    l_str:='truncate table basedata';
    execute immediate l_str;
    l_facttable:=func_ngetvalue(p_tablename,p_dot);

    insert into basedata values(seq_basedata.nextval,'prompt 创建时间:'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
    insert into basedata values(seq_basedata.nextval,'prompt 脚本创建人:'||l_osuser);
    insert into basedata values(seq_basedata.nextval,'prompt 数据库名:'||l_dbname);

    insert into basedata values(seq_basedata.nextval,'prompt 数据库字符集:'||l_charset);
    insert into basedata values(seq_basedata.nextval,'set feedback off;');
    insert into basedata values(seq_basedata.nextval,'set define off;');
    insert into basedata values(seq_basedata.nextval,'');

 

    l_index:=l_facttable.first;
    loop
      exit when l_index is null;
      l_tblname:=trim(replace(l_facttable(l_index),chr(10),' '));

      if l_tblname  is not null then
        insert into basedata values(seq_basedata.nextval,'prompt 删除表:'||l_tblname||'的数据');
        insert into basedata values(seq_basedata.nextval,'truncate table   '||l_tblname||'; ');

      end if;
      exit when l_index=l_facttable.last;
      l_index:=l_facttable.next(l_index);
    end loop;

    l_index:=l_facttable.first;
    loop
      exit when l_index is null;
      l_tblname:=trim(replace(l_facttable(l_index),chr(10),' '));
      if l_tblname is not null then

        p_writesql(l_tblname,' where 1=1 ',p_errid);
      end if;
      exit when l_index=l_facttable.last;
      l_index:=l_facttable.next(l_index);
    end loop;

    insert into basedata values(seq_basedata.nextval,'set feedback on;');
    insert into basedata values(seq_basedata.nextval,'set define on;');
    insert into basedata values(seq_basedata.nextval,'prompt 装载数据完毕;');
    commit;
  exception
    when others then
      rollback;
      p_errid:=sqlcode;
      raise;
      return;
  end;

end pkg_comm;
/


spool off

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

执行方法如:


 declare  
    l_errid int;
    l_tbname varchar2(500);
  begin
    l_tbname:='aaa';
    pkg_comm.p_writesqls(l_tbname,',',l_errid);
    if l_errid<>0 then
      dbms_output.put_line('请检查错误');
    end if;
  end;

 

此时是把数据写入到basedata表中,也可以放到文件中,具体调用请自己参照具体过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值