各位大侠  帮忙翻译下下面这段脚本吧  谢拉--*******************************
--File main.sql
--*******************************
set echo off serveroutput on feedback off trimspool on line 10000 verify off head off@@ one_table.sql 'COMPONENT';set head on line 100 feedback on termout on echo on--*******************************
--File one_table.sql
--*******************************
prompt *** Process &1 ...;set serveroutput on echo off feedback off trimspool on line 10000 verify off feedback off head off termout off
define tab_name = '&1'spool ./data/&tab_name..sql
declare
   cursor c1(v_owner       varchar2,  v_tab_name    varchar2) is 
      select  column_name, data_type
      from    all_tab_columns
      where   table_name = v_tab_name
      and     owner      = v_owner;
   field_list    varchar2(4000);
   field_list_sel    varchar2(4000);
   fmt_field         varchar2(200);
   date_format       varchar2(30) := 'yyyymmddhh24miss';
   v_owner           varchar2(30)  := user;
   v_tab_name        varchar2(30) := upper(trim('&tab_name'));
begin
   dbms_output.enable(1000000);
   dbms_output.put_line('set echo off feedback off');
   dbms_output.put_line('spool ./data/&tab_name' || '_data.sql');   -- Print the insert field 
   dbms_output.put_line('variable field_list varchar2(4000);');
   dbms_output.put_line('begin');
   dbms_output.put_line('  :field_list := ''insert into &tab_name (''' );   for rec1 in c1(v_owner, v_tab_name) loop
      if c1%rowcount = 1 then
         field_list := ' || '' ' || rec1.column_name || '''';
      else
         field_list := ' || '',' || rec1.column_name || '''';
      end if;
      dbms_output.put_line(field_list);
    end loop;    dbms_output.put_line('||'')''||chr(10)||''values ('';');
    dbms_output.put_line('end;');
    dbms_output.put_line('/');        -- For select SQL to generate insert statement
    dbms_output.put_line('select :field_list || chr(10) ||');
   for rec1 in c1(v_owner, v_tab_name) loop
      -- For insert values clause
      if rec1.data_type = 'DATE' then
         fmt_field := '''to_date(''''''||to_char(' || rec1.column_name || ', ''' || 
                      date_format || ''')||'''''',''''' || date_format || ''''')''';
      elsif rec1.data_type in ('CHAR', 'VARCHAR2') then
         fmt_field := ''''''''' || replace(' || rec1.column_name || ','''''''', '''''''''''')|| ''''''''';
      else
         fmt_field := 'to_char(' || rec1.column_name || ')';
      end if;
      if c1%rowcount = 1 then
         field_list_sel := fmt_field;
      else 
         field_list_sel := ' ||'','' || ' || fmt_field;
      end if;
      dbms_output.put_line(field_list_sel);
   end loop;
   dbms_output.put_line('|| '');''');
   dbms_output.put_line('from &tab_name ;');
   dbms_output.put_line('spoo off;');
end;
/
spool off;@ ./data/&tab_name..sqlset head on line 100 termout on

解决方案 »

  1.   

    代码好长,给你个参考学习的网页吧。
    http://qinguanglong.2007.blog.163.com/blog/static/261561412009111611319749/
      

  2.   

    不知道是不是楼主要的。
    -- 这些代码的目的是将COMPONENT表的数据
    -- 导出Insert语句
    -- one_table.sql的代码是通过all_tab_columns,
    -- 将表的列写成查询语句,并且加上set feedback off等设置命令
    -- 并在./data/以导出表的名称命名的Sql文件,然后在执行这个文件,
    -- 形成./data/以导出表的名称加_data命名的Sql文件。--*******************************
    --File main.sql
    --*******************************
    set echo off         -- 是否显示脚本中正在执行的SQL语句 on 显示 off 不显示
    set serveroutput on  -- 使用dbms_output.put_line时,是否在屏幕上显示信息 on 显示 off 不显示
    set feedback off     -- 是否显示当前sql语句查询或修改的行数 off 不显示查询或修改的行数 
    set trimspool on     -- 是否去除重定向(spool)输出每行的拖尾空格,on 去除 off 不去除
    set line 10000       -- 设置一行显示的字符总数
    set verify off       -- 是否显示替代变量被替代前后的语句 on 显示 off 不显示
    set head off         -- 是否显示列标题 on 显示 off 不显示@@ one_table.sql 'COMPONENT';  -- 执行main.sql目录下的one_table.sql 'COMPONENT' 是输入的参数set head on        
    set line 100 
    set feedback on 
    set termout on   -- 是否显示脚本中的命令的执行结果 on 显示 off 不显示
    set echo on      --*******************************
    --File one_table.sql
    --*******************************
    prompt *** Process &1 ...;       -- 在屏幕上显示  *** Process COMPONENT ...set serveroutput on 
    set echo off 
    set feedback off 
    set trimspool on 
    set line 10000 
    set verify off 
    set feedback off 
    set head off 
    set termout off
    define tab_name = '&1'           -- 定义变量 tab_name 并且将 'COMPONENT' 赋值给tab_namespool ./data/&tab_name..sql      -- 将屏幕显示的结果输出到./data/COMPONENT.sql文件中
    declare                          -- 声明变量 关键字
      -- 定义 游标 C1 有两个入口参数 v_owner v_tab_name
      cursor c1(v_owner varchar2, v_tab_name varchar2) is
      select column_name, data_type
        from all_tab_columns
       where table_name = v_tab_name
         and owner = v_owner;
      -- 变量的注释只能用猜的
      field_list      varchar2(4000);  -- 存储表列的列表
      field_list_sel  varchar2(4000);  -- 存储选择的表列的列表
      fmt_field       varchar2(200);       
      date_format     varchar2(30) := 'yyyymmddhh24miss'; -- 日期格式
      v_owner varchar2(30) := user;  
      v_tab_name varchar2(30) := upper(trim('&tab_name')); 
    begin
      dbms_output.enable(1000000);   -- 设置dmbs_output输出的缓冲区大小
      dbms_output.put_line('set echo off feedback off'); -- 在屏幕上输出 "set echo off feedback off" 信息
      dbms_output.put_line('spool ./data/&tab_name' || '_data.sql');
      -- Print the insert field 
      dbms_output.put_line('variable field_list varchar2(4000);');
      dbms_output.put_line('begin');
      dbms_output.put_line(' :field_list := ''insert into &tab_name (''' );
      -- 打开游标并c1并循环提取游标数据
      for rec1 in c1(v_owner, v_tab_name) loop
        if c1%rowcount = 1 then  -- 检查游标是否只有一条数据
          field_list := ' || '' ' || rec1.column_name || '''';
        else
          field_list := ' || '',' || rec1.column_name || '''';
        end if;
        dbms_output.put_line(field_list);
      end loop;  dbms_output.put_line('||'')''||chr(10)||''values ('';');
      dbms_output.put_line('end;');
      dbms_output.put_line('/');   -- For select SQL to generate insert statement
      dbms_output.put_line('select :field_list || chr(10) ||');
      for rec1 in c1(v_owner, v_tab_name) loop
        -- For insert values clause
        if rec1.data_type = 'DATE' then
          fmt_field := '''to_date(''''''||to_char(' || rec1.column_name || ', ''' || 
          date_format || ''')||'''''',''''' || date_format || ''''')''';
        elsif rec1.data_type in ('CHAR', 'VARCHAR2') then
          fmt_field := ''''''''' || replace(' || rec1.column_name || ','''''''', '''''''''''')|| ''''''''';
        else
          fmt_field := 'to_char(' || rec1.column_name || ')';
        end if;
        if c1%rowcount = 1 then
          field_list_sel := fmt_field;
        else 
          field_list_sel := ' ||'','' || ' || fmt_field;
        end if;
        dbms_output.put_line(field_list_sel);
      end loop;
      dbms_output.put_line('|| '');''');
      dbms_output.put_line('from &tab_name ;');
      dbms_output.put_line('spoo off;');
    end;
    /
    spool off;@ ./data/&tab_name..sqlset head on 
    set line 100
    set termout on
      

  3.   

    谢谢啦 就是这个  但能不能再详细点啊。。初学   但老大给个脚本叫我看懂。。''''''''' || replace('像这种红色的就只是一个字符串吗  := 就相当于赋值???
      

  4.   

    顺便再问个问题
    product
     名称                                      是否为空? 类型
     ----------------------------------------- -------- -------------- PRODUCT_CODE                              NOT NULL NUMBER
     PRODUCT_NAME                              NOT NULL VARCHAR2(20)
     PRODUCT_DESC                              NOT NULL VARCHAR2(20)
     CREATED_DATE                              NOT NULL VARCHAR2(20)
    product_target 
     名称                                      是否为空? 类型
     ----------------------------------------- -------- -------------- PRODUCT_DESC                              NOT NULL VARCHAR2(20)
     PRODUCT_CODE                                       NUMBER
     PRODUCT_NAME                              NOT NULL VARCHAR2(20)
     CREATED_DATE                              NOT NULL VARCHAR2(20)
     UPDATED_DATE                                       DATE
    两个表之间要进行数据的复制
    我用的SQL> insert into product_target select product_desc,product_code,product_name,cr
    eated_date,sysdate from product;  但他要我假设两个表在不同的数据库并且没有权限连接并且要使用SQL语句导出数据插入数据