簡體   English   中英

在sqlplus中為Oracle數據庫假脫機

[英]Spooling in sqlplus for Oracle database

我有100個Oracle查詢的.sql文件,因此假脫機將所有100個查詢的結果寫入一個文件,但是我希望為每個查詢創建一個文件,對於100個查詢應該有100個文件特定查詢的結果。

這不是很明顯嗎? 在SELECT之前設置SPOOL,在SELECT之后設置SPOOL OFF。 鍵入很多,因為每個SPOOL應該有自己的文件名。

也許您可以創建一個腳本來為您執行此操作。 使用UTL_FILE,您將逐行讀取並創建通用假脫機文件名(例如Q1.TXT,Q2.TXT等),然后將所有內容寫回到新的大型SQL文件中。

這是一個例子。 我的LARGE.SQL包含幾個SELECT語句:

select count(*) from tab;

select department_name from departments
where department_id < 100;

select sysdate 
from dual;

以下腳本創建一個LARGE_W.SQL,該LARGE_W.SQL在每個SELECT之間插入了SPOOL命令:

SQL> declare
  2    l_file_r utl_file.file_type;  -- read large.sql
  3    l_file_w utl_file.file_type;  -- write large_2.sql
  4    l_text   varchar2(32767);     -- read line by line
  5    i        number := 1;         -- counter
  6  begin
  7    l_file_r := utl_file.fopen('EXT_DIR', 'large.sql'  , 'r');
  8    l_file_w := utl_file.fopen('EXT_DIR', 'large_w.sql', 'w');
  9
 10    begin
 11      loop
 12        utl_file.get_line(l_file_r, l_text, 32767);
 13
 14        if regexp_substr(trim(upper(l_text)), '^\w+') = 'SELECT' then
 15           -- the first word is SELECT
 16           utl_file.put_line(l_file_w, 'SPOOL OFF');
 17           utl_file.put_line(l_file_w, 'SPOOL Q' || to_char(i) ||'.TXT');
 18           i := i + 1;
 19        end if;
 20        -- lines different than 1st in this SELECT section
 21        utl_file.put_line(l_file_w, l_text);
 22      end loop;
 23    exception
 24      when no_data_found then
 25        utl_file.put_line(l_file_w, 'SPOOL OFF');
 26        null;
 27    end;
 28
 29    utl_file.fclose(l_file_r);
 30    utl_file.fclose(l_file_w);
 31  end;
 32  /

PL/SQL procedure successfully completed.

SQL>

結果是LARGE_W.SQL

SPOOL OFF
SPOOL Q1.TXT
select count(*) from tab;

SPOOL OFF
SPOOL Q2.TXT
select department_name from departments
where department_id < 100;

SPOOL OFF
SPOOL Q3.TXT
select sysdate 
from dual;
SPOOL OFF

運行時,它將創建3個Qn.TXT文件:

SQL> @c:\temp\large_w.sql
not spooling currently

  COUNT(*)
----------
        40


DEPARTMENT_NAME
------------------------------
Administration
Marketing
Purchasing
Human Resources
Shipping
IT
Public Relations
Sales
Executive

9 rows selected.


SYSDATE
--------
16:09:42

SQL> $dir q*.txt
 Volume in drive C is OSDisk
 Volume Serial Number is 7635-F892

 Directory of C:\Users\lf

21.01.2018.  16:09               250 Q1.TXT
21.01.2018.  16:09               926 Q2.TXT
21.01.2018.  16:09               250 Q3.TXT
               3 File(s)          1.426 bytes
               0 Dir(s)  351.802.810.368 bytes free

SQL> $type q1.txt

  COUNT(*)
----------
        40


SQL>

那只是個主意; 當然,它可能需要改進(提示:子查詢),但是現在您有了一些入門的知識。

如果在UNIX環境中運行sqlplus,則可以使用awk命令將每個分號轉換為具有唯一輸出文件的假脫機命令。 最后一個是多余的,您可以消除(或修改awk !)

awk '{gsub(";",";\nspool outputfile_"NR,$0);print}' yoursqlfile.sql >newsqlfile.sql

這將轉換一個文件,例如

spool file1
select 1 FROM DUAL;
select 2 FROM DUAL;
select 3 FROM
(select 4 FROM DUAL);
SELECT 5 FROM
DUAL;

spool file1
select 1 FROM DUAL;
spool outputfile_2
select 2 FROM DUAL;
spool outputfile_3
select 3 FROM
(select 4 FROM DUAL);
spool outputfile_5
SELECT 5 FROM
DUAL;
spool outputfile_7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM