sqlplus_set用法

set heading off——不顯示每行的列名
set echo off——不重複顯示所要執行的sql語句
set line 200——設置每行顯示200字符
set pages 0——不進行分頁顯示
set feed off——不顯示sql語句的運行結果(selected N rows)


SQL code
-- 這些代碼的目的是將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_name

spool ./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..sql

set head on
set line 100
set termout on

 sql

相關文章
相關標籤/搜索