[英]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.