天天看點

提供了根據表中的資料自動生成insert語句的資料庫包,還提供了一些簡單的工具

-----------------------------------------------

-- 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

  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;

  function func_getleft(

                        p_str varchar2,

                        p_len number

                        )return varchar2;

  function func_ngetleft(

                        p_str nvarchar2,

                        p_len number

                        )return nvarchar2;

  function func_getright(

                         p_str varchar2,

                         p_len number

                         )return varchar2;

  function func_ngetright(

                         p_str nvarchar2,

                         p_len number

                         )return nvarchar2;

  function func_getlastpart(

                            p_str varchar2, --字元

                            p_dot varchar2-- 分隔符

                            ) return varchar2;

  function func_ngetlastpart(

                            p_str nvarchar2, --字元

                            p_dot nvarchar2-- 分隔符

                            ) return nvarchar2;

  function func_getpriopart(

                            p_str varchar2, --字元

                            p_dot varchar2-- 分隔符

                           )return varchar2;

  function func_ngetpriopart(

                            p_str nvarchar2, --字元

                            p_dot nvarchar2-- 分隔符

                           )return nvarchar2;

  function func_getvalue(

                         p_str varchar2, --字元串

                         p_sign varchar2  --分隔符

                        ) return t_getvalue;

  function func_ngetvalue(

                         p_str nvarchar2, --字元串

                         p_sign nvarchar2  --分隔符

                        ) return t_ngetvalue;

  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;

  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;

  function func_getvalues(

                          p_tablename varchar2,

                          p_where varchar2

                          )return varchar2;

  function func_ngetvalues(

                          p_tablename nvarchar2,

                          p_where nvarchar2

                          )return nvarchar2;

  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

  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;

  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;

  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;

  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;

  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;

  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;

  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;

  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表中,也可以放到檔案中,具體調用請自己參照具體過程