1.使用SQL*PLUS動(dòng)態(tài)生成批量腳本 將spool與select命令結合起來(lái)使用,可以生成一個(gè)腳本,腳本中包含有可以批量執行某一任務(wù)的語(yǔ)句。 例1: 生成一個(gè)腳本,刪除SCOTT用戶(hù)下的所有的表: a. 創(chuàng )建gen_drop_table.sql文件,包含如下語(yǔ)句: SPOOL c:\drop_table.sql SELECT ‘DROP TABLE ‘|| table_name ||‘;‘ FROM user_tables; SPOOL OFF b. 以SCOTT用戶(hù)登錄數據庫 SQLPLUS > @ …..\gen_dorp_table.sql c. 在c盤(pán)根目錄下會(huì )生成文件drop_table.sql文件,包含刪除所有表的語(yǔ)句,如下所示: SQL> SELECT ‘DROP TABLE ‘|| table_name ||‘;‘ FROM user_tables;
‘DROPTABLE‘||TABLE_NAME||‘;‘ -------------------------------------------------------------------------------- DROP TABLE DEPT; DROP TABLE EMP; DROP TABLE PARENT; DROP TABLE STAT_VENDER_TEMP; DROP TABLE TABLE_FORUM;
5 rows selected.
SQL> SPOOL OFF d. 對生成的drop_table.sql文件進(jìn)行編輯去掉不必要的部分,只留下drop table …..語(yǔ)句 e. 在scott用戶(hù)下運行dorp_table.sql文件,刪除scott用戶(hù)下所有的表。 SQLPLUS > @ c:\dorp_table.sql
a. 創(chuàng )建gen_drop_table.sql文件,包含如下語(yǔ)句: set echo off set feedback off set newpage none set pagesize 5000 set linesize 500 set verify off set pagesize 0 set term off set trims on set linesize 600 set heading off set timing off set verify off set numwidth 38 SPOOL c:\drop_table.sql SELECT ‘DROP TABLE ‘|| table_name ||‘;‘ FROM user_tables; SPOOL OFF b. 以SCOTT用戶(hù)登錄數據庫 SQLPLUS > @ …..\gen_dorp_table.sql c. 在c盤(pán)根目錄下會(huì )生成文件drop_table.sql文件,包含刪除所有表的語(yǔ)句,如下所示: DROP TABLE DEPT; DROP TABLE EMP; DROP TABLE PARENT; DROP TABLE STAT_VENDER_TEMP; DROP TABLE TABLE_FORUM; d. 在scott用戶(hù)下運行dorp_table.sql文件,刪除scott用戶(hù)下所有的表。 SQLPLUS > @ c:\dorp_table.sql
2.將一個(gè)表中的數據導出生成一個(gè)文本文件,列與列之間以”,”隔開(kāi) set echo off set feedback off set newpage none set pagesize 5000 set linesize 500 set verify off set pagesize 0 set term off set trims on set linesize 600 set heading off set timing off set verify off set numwidth 38 SPOOL c:\drop_table.sql select DEPTNO || ‘,‘ || DNAME FROM DEPT; SPOOL OFF 將上面的內容保存為一個(gè)文本文件后,以scott登錄,執行該文件后顯示結果: 10,ACCOUNTING 20,RESEARCH 30,SALES 40,OPERATIONS
通過(guò)上面的兩個(gè)例子,我們可以將: set echo off set feedback off set newpage none set pagesize 5000 set linesize 500 set verify off set pagesize 0 set term off set trims on set linesize 600 set heading off set timing off set verify off set numwidth 38 SPOOL c:\具體的文件名 你要運行的sql語(yǔ)句 SPOOL OFF 作為一個(gè)模版,只要將必要的語(yǔ)句假如這個(gè)模版就可以了。
在oracle的較新版本中,還可以用set colsep命令來(lái)實(shí)現上面的功能: SQL> set colsep , SQL> select * from dept; 10,ACCOUNTING ,NEW YORK 20,RESEARCH ,DALLAS 30,SALES ,CHICAGO 40,OPERATIONS ,BOSTON 35,aa ,bb
3.動(dòng)態(tài)生成spool命令所需的文件名 在我們上面的例子中,spool命令所需要的文件名都是固定的。有時(shí)我們需要每天spool一次,并且每次spool的文件名都不相同,如文件名包含當天的日期,該如何實(shí)現呢? column dat1 new_value filename; select to_char(sysdate,‘yyyymmddhh24mi‘) dat1 from dual; spool c:\&&filename..txt select * from dept; spool off;
4.如何從腳本文件中得到WINDOWS環(huán)境變量的值: 在windos中: spool c:\temp\%ORACLE_SID%.txt select * from dept; ... spool off
5.如何指定缺省的編輯腳本的目錄 在sql*plus中,可以用save命令,將上一條執行的sql語(yǔ)句保存到一個(gè)文件中,但是如何設置該文件的缺省目錄呢? 通過(guò)SQL> set editfile c:\temp\file.sql 命令,可以設置其缺省目錄為c:\tmpe,缺省文件名為file.sql。
6.如何除去表中相同的行 找到相同的行: SELECT * FROM dept a WHERE ROWID <> (SELECT MAX(ROWID) FROM dept b WHERE a.deptno = b.deptno AND a.dname = b.dname -- Make sure all columns are compared AND a.loc = b.loc);
注釋?zhuān)?span lang="EN-US"> 如果只找deptno列相同的行,上面的查詢(xún)可以改為: SELECT * FROM dept a WHERE ROWID <> (SELECT MAX(ROWID) FROM dept b WHERE a.deptno = b.deptno)
刪除相同的行: DELETE FROM dept a WHERE ROWID <> (SELECT MAX(ROWID FROM dept b WHERE a.deptno = b.deptno AND a.dname = b.dname -- Make sure all columns are compared AND a.loc = b.loc);
如,將下面三行語(yǔ)句存為一個(gè)腳本文件,運行該腳本文件,會(huì )提示三次,讓輸入deptnoval的值: select count(*) from emp where deptno = &deptnoval; select count(*) from emp where deptno = &deptnoval; select count(*) from emp where deptno = &deptnoval;
將下面三行語(yǔ)句存為一個(gè)腳本文件,運行該腳本文件,則只會(huì )提示一次,讓輸入deptnoval的值: select count(*) from emp where deptno = &deptnoval; select count(*) from emp where deptno = &deptnoval; select count(*) from emp where deptno = &deptnoval;