Oracle的sql*plus是與oracle進行交互的客戶端工具。在sql*plus中,可以運行sql*plus命令與sql*plus語句。
我們通常所說的DML、DDL、DCL語句都是sql*plus語句,它們執行完后,都可以保存在一個被稱為sql buffer的內存區域中,並且只能保存一條最近執行的sql語句,我們可以對保存在sql buffer中的sql 語句進行修改,然后再次執行,sql*plus一般都與數據庫打交道。
除了sql*plus語句,在sql*plus中執行的其它語句我們稱之為sql*plus命令。它們執行完后,不保存在sql buffer的內存區域中,它們一般用來對輸出的結果進行格式化顯示,以便於制作報表。
下面就介紹一下一些常用的sql*plus命令:
1. 執行一個SQL腳本文件
SQL>start file_name
SQL>@ file_name
我們可以將多條sql語句保存在一個文本文件中,這樣當要執行這個文件中的所有的sql語句時,用上面的任一命令即可,這類似於dos中的批處理。
我們通常所說的DML、DDL、DCL語句都是sql*plus語句,它們執行完后,都可以保存在一個被稱為sql buffer的內存區域中,並且只能保存一條最近執行的sql語句,我們可以對保存在sql buffer中的sql 語句進行修改,然后再次執行,sql*plus一般都與數據庫打交道。
除了sql*plus語句,在sql*plus中執行的其它語句我們稱之為sql*plus命令。它們執行完后,不保存在sql buffer的內存區域中,它們一般用來對輸出的結果進行格式化顯示,以便於制作報表。
下面就介紹一下一些常用的sql*plus命令:
1. 執行一個SQL腳本文件
SQL>start file_name
SQL>@ file_name
我們可以將多條sql語句保存在一個文本文件中,這樣當要執行這個文件中的所有的sql語句時,用上面的任一命令即可,這類似於dos中的批處理。
@與@@的區別是什么?
@等於start命令,用來運行一個sql腳本文件。
@命令調用當前目錄下的,或指定全路徑,或可以通過SQLPATH環境變量搜尋到的腳本文件。該命令使用是一般要指定要執行的文件的全路徑,否則從缺省路徑(可用SQLPATH變量指定)下讀取指定的文件。
@@用在sql腳本文件中,用來說明用@@執行的sql腳本文件與@@所在的文件在同一目錄下,而不用指定要執行sql腳本文件的全路徑,也不是從SQLPATH環境變量指定的路徑中尋找sql腳本文件,該命令一般用在腳本文件中。
如:在c:\temp目錄下有文件start.sql和nest_start.sql,start.sql腳本文件的內容為:
@@nest_start.sql - - 相當於@ c:\temp\nest_start.sql
則我們在sql*plus中,這樣執行:
SQL> @ c:\temp\start.sql
@等於start命令,用來運行一個sql腳本文件。
@命令調用當前目錄下的,或指定全路徑,或可以通過SQLPATH環境變量搜尋到的腳本文件。該命令使用是一般要指定要執行的文件的全路徑,否則從缺省路徑(可用SQLPATH變量指定)下讀取指定的文件。
@@用在sql腳本文件中,用來說明用@@執行的sql腳本文件與@@所在的文件在同一目錄下,而不用指定要執行sql腳本文件的全路徑,也不是從SQLPATH環境變量指定的路徑中尋找sql腳本文件,該命令一般用在腳本文件中。
如:在c:\temp目錄下有文件start.sql和nest_start.sql,start.sql腳本文件的內容為:
@@nest_start.sql - - 相當於@ c:\temp\nest_start.sql
則我們在sql*plus中,這樣執行:
SQL> @ c:\temp\start.sql
2. 對當前的輸入進行編輯
SQL>edit
3. 重新運行上一次運行的sql語句
SQL>/
4. 將顯示的內容輸出到指定文件
SQL> SPOOL file_name
在屏幕上的所有內容都包含在該文件中,包括你輸入的sql語句。
5. 關閉spool輸出
SQL> SPOOL OFF
只有關閉spool輸出,才會在輸出文件中看到輸出的內容。
6.顯示一個表的結構
SQL> desc table_name
7. COL命令:
主要格式化列的顯示形式。
該命令有許多選項,具體如下:
COL[UMN] [{ column|expr} [ option ...]]
Option選項可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
1). 改變缺省的列標題
COLUMN column_name HEADING column_heading
For example:
Sql>select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- ---------
10 ACCOUNTING NEW YORK
sql>col LOC heading location
sql>select * from dept;
DEPTNO DNAME location
--------- ---------------------------- -----------
10 ACCOUNTING NEW YORK
2). 將列名ENAME改為新列名EMPLOYEE NAME並將新列名放在兩行上:
Sql>select * from emp
Department name Salary
---------- ---------- ----------
10 aaa 11
SQL> COLUMN ENAME HEADING ’Employee|Name’
Sql>select * from emp
Employee
Department name Salary
---------- ---------- ----------
10 aaa 11
note: the col heading turn into two lines from one line.
3). 改變列的顯示長度:
FOR[MAT] format
Sql>select empno,ename,job from emp;
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
Sql> col ename format a40
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
4). 設置列標題的對齊方式
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
SQL> col ename justify center
SQL> /
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
對於NUMBER型的列,列標題缺省在右邊,其它類型的列標題缺省在左邊
5). 不讓一個列顯示在屏幕上
NOPRI[NT]|PRI[NT]
SQL> col job noprint
SQL> /
EMPNO ENAME
---------- ----------------------------------------
7369 SMITH
7499 ALLEN
7521 WARD
6). 格式化NUMBER類型列的顯示:
SQL> COLUMN SAL FORMAT $99,990
SQL> /
Employee
Department Name Salary Commission
---------- ---------- --------- ----------
30 ALLEN $1,600 300
7). 顯示列值時,如果列值為NULL值,用text值代替NULL值
COMM NUL[L] text
SQL>COL COMM NUL[L] text
8). 設置一個列的回繞方式
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
COL1
--------------------
HOW ARE YOU?
SQL>COL COL1 FORMAT A5
SQL>COL COL1 WRAPPED
COL1
-----
HOW A
RE YO
U?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW
ARE
YOU?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW A
9). 顯示列的當前的顯示屬性值
SQL> COLUMN column_name
10). 將所有列的顯示屬性設為缺省值
SQL> CLEAR COLUMNS
8. 屏蔽掉一個列中顯示的相同的值
BREAK ON break_column
SQL> BREAK ON DEPTNO
SQL> SELECT DEPTNO, ENAME, SAL
FROM EMP
WHERE SAL < 2500
ORDER BY DEPTNO;
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
9. 在上面屏蔽掉一個列中顯示的相同的值的顯示中,每當列值變化時在值變化之前插入n個空行。
BREAK ON break_column SKIP n
SQL> BREAK ON DEPTNO SKIP 1
SQL> /
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
10. 顯示對BREAK的設置
SQL> BREAK
11. 刪除6、7的設置
SQL> CLEAR BREAKS
12. Set 命令:
該命令包含許多子命令:
SET system_variable value
system_variable value 可以是如下的子句之一:
APPI[NFO]{ON|OFF|text}
ARRAY[SIZE] {15|n}
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}
AUTOP[RINT] {ON|OFF}
AUTORECOVERY [ON|OFF]
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
BLO[CKTERMINATOR] {.|c}
CMDS[EP] {;|c|ON|OFF}
COLSEP {_|text}
COM[PATIBILITY]{V7|V8|NATIVE}
CON[CAT] {.|c|ON|OFF}
COPYC[OMMIT] {0|n}
COPYTYPECHECK {ON|OFF}
DEF[INE] {&|c|ON|OFF}
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]
ECHO {ON|OFF}
EDITF[ILE] file_name[.ext]
EMB[EDDED] {ON|OFF}
ESC[APE] {\|c|ON|OFF}
FEED[BACK] {6|n|ON|OFF}
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}
FLU[SH] {ON|OFF}
HEA[DING] {ON|OFF}
HEADS[EP] {||c|ON|OFF}
INSTANCE [instance_path|LOCAL]
LIN[ESIZE] {80|n}
LOBOF[FSET] {n|1}
LOGSOURCE [pathname]
LONG {80|n}
LONGC[HUNKSIZE] {80|n}
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]
NEWP[AGE] {1|n|NONE}
NULL text
NUMF[ORMAT] format
NUM[WIDTH] {10|n}
PAGES[IZE] {24|n}
PAU[SE] {ON|OFF|text}
RECSEP {WR[APPED]|EA[CH]|OFF}
RECSEPCHAR {_|c}
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_
WRAPPED]|TRU[NCATED]}]
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}
SHOW[MODE] {ON|OFF}
SQLBL[ANKLINES] {ON|OFF}
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}
SQLCO[NTINUE] {> |text}
SQLN[UMBER] {ON|OFF}
SQLPRE[FIX] {#|c}
SQLP[ROMPT] {SQL>|text}
SQLT[ERMINATOR] {;|c|ON|OFF}
SUF[FIX] {SQL|text}
TAB {ON|OFF}
TERM[OUT] {ON|OFF}
TI[ME] {ON|OFF}
TIMI[NG] {ON|OFF}
TRIM[OUT] {ON|OFF}
TRIMS[POOL] {ON|OFF}
UND[ERLINE] {-|c|ON|OFF}
VER[IFY] {ON|OFF}
WRA[P] {ON|OFF}
1). 設置當前session是否對修改的數據進行自動提交
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
2).在用start命令執行一個sql腳本時,是否顯示腳本中正在執行的SQL語句
SQL> SET ECHO {ON|OFF}
3).是否顯示當前sql語句查詢或修改的行數
SQL> SET FEED[BACK] {6|n|ON|OFF}
默認只有結果大於6行時才顯示結果的行數。如果set feedback 1 ,則不管查詢到多少行都返回。當為off 時,一律不顯示查詢的行數
4).是否顯示列標題
SQL> SET HEA[DING] {ON|OFF}
當set heading off 時,在每頁的上面不顯示列標題,而是以空白行代替
5).設置一行可以容納的字符數
SQL> SET LIN[ESIZE] {80|n}
如果一行的輸出內容大於設置的一行可容納的字符數,則折行顯示。
6).設置頁與頁之間的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
當set newpage 0 時,會在每頁的開頭有一個小的黑方框。
當set newpage n 時,會在頁和頁之間隔着n個空行。
當set newpage none 時,會在頁和頁之間沒有任何間隔。
7).顯示時,用text值代替NULL值
SQL> SET NULL text
8).設置一頁有多少行數
SQL> SET PAGES[IZE] {24|n}
如果設為0,則所有的輸出內容為一頁並且不顯示列標題
9).是否顯示用DBMS_OUTPUT.PUT_LINE包進行輸出的信息。
SQL> SET SERVEROUT[PUT] {ON|OFF}
在編寫存儲過程時,我們有時會用dbms_output.put_line將必要的信息輸出,以便對存儲過程進行調試,只有將serveroutput變量設為on后,信息才能顯示在屏幕上。
10).當SQL語句的長度大於LINESIZE時,是否在顯示時截取SQL語句。
SQL> SET WRA[P] {ON|OFF}
當輸出的行的長度大於設置的行的長度時(用set linesize n命令設置),當set wrap on時,輸出行的多於的字符會另起一行顯示,否則,會將輸出行的多於字符切除,不予顯示。
11).是否在屏幕上顯示輸出的內容,主要用與SPOOL結合使用。
SQL> SET TERM[OUT] {ON|OFF}
在用spool命令將一個大表中的內容輸出到一個文件中時,將內容輸出在屏幕上會耗費大量的時間,設置set termspool off后,則輸出的內容只會保存在輸出文件中,不會顯示在屏幕上,極大的提高了spool的速度。
12).將SPOOL輸出中每行后面多余的空格去掉
SQL> SET TRIMS[OUT] {ON|OFF}
13)顯示每個sql語句花費的執行時間
set TIMING {ON|OFF}
14). 遇到空行時不認為語句已經結束,從后續行接着讀入。
SET SQLBLANKLINES ON
Sql*plus中, 不允許sql語句中間有空行, 這在從其它地方拷貝腳本到sql*plus中執行時很麻煩. 比如下面的腳本:
select deptno, empno, ename
from emp
SET SQLBLANKLINES ON
Sql*plus中, 不允許sql語句中間有空行, 這在從其它地方拷貝腳本到sql*plus中執行時很麻煩. 比如下面的腳本:
select deptno, empno, ename
from emp
where empno = '7788';
如果拷貝到sql*plus中執行, 就會出現錯誤。這個命令可以解決該問題
如果拷貝到sql*plus中執行, 就會出現錯誤。這個命令可以解決該問題
15).設置DBMS_OUTPUT的輸出
SET SERVEROUTPUT ON BUFFER 20000
用dbms_output.put_line('strin_content');可以在存儲過程中輸出信息,對存儲過程進行調試
如果想讓dbms_output.put_line(' abc');的輸出顯示為:
SQL> abc,而不是SQL>abc,則在SET SERVEROUTPUT ON后加format wrapped參數。
SET SERVEROUTPUT ON BUFFER 20000
用dbms_output.put_line('strin_content');可以在存儲過程中輸出信息,對存儲過程進行調試
如果想讓dbms_output.put_line(' abc');的輸出顯示為:
SQL> abc,而不是SQL>abc,則在SET SERVEROUTPUT ON后加format wrapped參數。
16). 輸出的數據為html格式
set markup html
在8.1.7版本(也許是816? 不太確定)以后, sql*plus中有一個set markup html的命令, 可以將sql*plus的輸出以html格式展現.
注意其中的spool on, 當在屏幕上輸出的時候, 我們看不出與不加spool on有什么區別, 但是當我們使用spool filename 輸出到文件的時候, 會看到spool文件中出現了等tag.
set markup html
在8.1.7版本(也許是816? 不太確定)以后, sql*plus中有一個set markup html的命令, 可以將sql*plus的輸出以html格式展現.
注意其中的spool on, 當在屏幕上輸出的時候, 我們看不出與不加spool on有什么區別, 但是當我們使用spool filename 輸出到文件的時候, 會看到spool文件中出現了等tag.
14.修改sql buffer中的當前行中,第一個出現的字符串
C[HANGE] /old_value/new_value
SQL> l
1* select * from dept
SQL> c/dept/emp
1* select * from emp
15.編輯sql buffer中的sql語句
EDI[T]
16.顯示sql buffer中的sql語句,list n顯示sql buffer中的第n行,並使第n行成為當前行
L[IST] [n]
17.在sql buffer的當前行下面加一行或多行
I[NPUT]
18.將指定的文本加到sql buffer的當前行后面
A[PPEND]
SQL> select deptno,
2 dname
3 from dept;
DEPTNO DNAME
---------- --------------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
SQL> L 2
2* dname
SQL> a ,loc
2* dname,loc
SQL> L
1 select deptno,
2 dname,loc
3* from dept
SQL> /
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
19.將sql buffer中的sql語句保存到一個文件中
SAVE file_name
20.將一個文件中的sql語句導入到sql buffer中
GET file_name
21.再次執行剛才已經執行的sql語句
RUN
or
/
22.執行一個存儲過程
EXECUTE procedure_name
23.在sql*plus中連接到指定的數據庫
CONNECT user_name/passwd@db_alias
24.設置每個報表的頂部標題
TTITLE
25.設置每個報表的尾部標題
BTITLE
26.寫一個注釋
REMARK [text]
27.將指定的信息或一個空行輸出到屏幕上
PROMPT [text]
28.將執行的過程暫停,等待用戶響應后繼續執行
PAUSE [text]
Sql>PAUSE Adjust paper and press RETURN to continue.
29.將一個數據庫中的一些數據拷貝到另外一個數據庫(如將一個表的數據拷貝到另一個數據庫)
COPY {FROM database | TO database | FROM database TO database}
{APPEND|CREATE|INSERT|REPLACE} destination_table
[(column, column, column, ...)] USING query
sql>COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST
create emp_temp
USING SELECT * FROM EMP
30.不退出sql*plus,在sql*plus中執行一個操作系統命令:
HOST
Sql> host hostname
該命令在windows下可能被支持。
31.在sql*plus中,切換到操作系統命令提示符下,運行操作系統命令后,可以再次切換回sql*plus:
!
sql>!
$hostname
$exit
sql>
該命令在windows下不被支持。
32.顯示sql*plus命令的幫助
HELP
如何安裝幫助文件:
Sql>@ ?\sqlplus\admin\help\hlpbld.sql ?\sqlplus\admin\help\helpus.sql
Sql>help index
33.顯示sql*plus系統變量的值或sql*plus環境變量的值
Syntax
SHO[W] option
where option represents one of the following terms or clauses:
system_variable
ALL
BTI[TLE]
ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|
TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]
LNO
PARAMETERS [parameter_name]
PNO
REL[EASE]
REPF[OOTER]
REPH[EADER]
SGA
SPOO[L]
SQLCODE
TTI[TLE]
USER
1) . 顯示當前環境變量的值:
Show all
2) . 顯示當前在創建函數、存儲過程、觸發器、包等對象的錯誤信息
Show error
當創建一個函數、存儲過程等出錯時,變可以用該命令查看在那個地方出錯及相應的出錯信息,進行修改后再次進行編譯。
3) . 顯示初始化參數的值:
show PARAMETERS [parameter_name]
4) . 顯示數據庫的版本:
show REL[EASE]
5) . 顯示SGA的大小
show SGA
6). 顯示當前的用戶名
show user
34.查詢一個用戶下的對象
SQL>select * from tab;
SQL>select * from user_objects;
SQL>select * from tab;
SQL>select * from user_objects;
35.查詢一個用戶下的所有的表
SQL>select * from user_tables;
SQL>select * from user_tables;
36.查詢一個用戶下的所有的索引
SQL>select * from user_indexes;
SQL>select * from user_indexes;
37. 定義一個用戶變量
方法有兩個:
a. define
b. COL[UMN] [{column|expr} NEW_V[ALUE] variable [NOPRI[NT]|PRI[NT]]
OLD_V[ALUE] variable [NOPRI[NT]|PRI[NT]]
下面對每種方式給予解釋:
a. Syntax
DEF[INE] [variable]|[variable = text]
定義一個用戶變量並且可以分配給它一個CHAR值。
a. Syntax
DEF[INE] [variable]|[variable = text]
定義一個用戶變量並且可以分配給它一個CHAR值。
assign the value MANAGER to the variable POS, type:
SQL> DEFINE POS = MANAGER
SQL> DEFINE POS = MANAGER
assign the CHAR value 20 to the variable DEPTNO, type:
SQL> DEFINE DEPTNO = 20
SQL> DEFINE DEPTNO = 20
list the definition of DEPTNO, enter
SQL> DEFINE DEPTNO
―――――――――――――――
DEFINE DEPTNO = ”20” (CHAR)
SQL> DEFINE DEPTNO
―――――――――――――――
DEFINE DEPTNO = ”20” (CHAR)
定義了用戶變量POS后,就可以在sql*plus中用&POS或&&POS來引用該變量的值,sql*plus不會再提示你給變量輸入值。
b. COL[UMN] [{column|expr} NEW_V[ALUE] variable [NOPRI[NT]|PRI[NT]]
NEW_V[ALUE] variable
指定一個變量容納查詢出的列值。
例:column col_name new_value var_name noprint
select col_name from table_name where ……..
將下面查詢出的col_name列的值賦給var_name變量.
NEW_V[ALUE] variable
指定一個變量容納查詢出的列值。
例:column col_name new_value var_name noprint
select col_name from table_name where ……..
將下面查詢出的col_name列的值賦給var_name變量.
一個綜合的例子:
得到一個列值的兩次查詢之差(此例為10秒之內共提交了多少事務):
column redo_writes new_value commit_count
得到一個列值的兩次查詢之差(此例為10秒之內共提交了多少事務):
column redo_writes new_value commit_count
select sum(stat.value) redo_writes
from v$sesstat stat, v$statname sn
where stat.statistic# = sn.statistic#
and sn.name = 'user commits';
from v$sesstat stat, v$statname sn
where stat.statistic# = sn.statistic#
and sn.name = 'user commits';
-- 等待一會兒(此處為10秒);
execute dbms_lock.sleep(10);
execute dbms_lock.sleep(10);
set veri off
select sum(stat.value) - &commit_count commits_added
from v$sesstat stat, v$statname sn
where stat.statistic# = sn.statistic#
and sn.name = 'user commits';
select sum(stat.value) - &commit_count commits_added
from v$sesstat stat, v$statname sn
where stat.statistic# = sn.statistic#
and sn.name = 'user commits';
38. 定義一個綁定變量
VAR[IABLE] [variable [NUMBER|CHAR|CHAR (n)|NCHAR|NCHAR (n) |VARCHAR2 (n)|NVARCHAR2 (n)|CLOB|NCLOB|REFCURSOR]]
定義一個綁定變量,該變量可以在pl/sql中引用。
可以用print命令顯示該綁定變量的信息。
如:
column inst_num heading "Inst Num" new_value inst_num format 99999;
column inst_name heading "Instance" new_value inst_name format a12;
column db_name heading "DB Name" new_value db_name format a12;
column dbid heading "DB Id" new_value dbid format 9999999999 just c;
prompt
prompt Current Instance
prompt ~~~~~~~~~~~~~~~~
prompt Current Instance
prompt ~~~~~~~~~~~~~~~~
select d.dbid dbid
, d.name db_name
, i.instance_number inst_num
, i.instance_name inst_name
from v$database d,
v$instance i;
, d.name db_name
, i.instance_number inst_num
, i.instance_name inst_name
from v$database d,
v$instance i;
variable dbid number;
variable inst_num number;
begin
:dbid := &dbid;
:inst_num := &inst_num;
end;
/
說明:
在sql*plus中,該綁定變量可以作為一個存儲過程的參數,也可以在匿名PL/SQL塊中直接引用。為了顯示用VARIABLE命令創建的綁定變量的值,可以用print命令
variable inst_num number;
begin
:dbid := &dbid;
:inst_num := &inst_num;
end;
/
說明:
在sql*plus中,該綁定變量可以作為一個存儲過程的參數,也可以在匿名PL/SQL塊中直接引用。為了顯示用VARIABLE命令創建的綁定變量的值,可以用print命令
注意:
綁定變量不同於變量:
1. 定義方法不同
2. 引用方法不同
綁定變量::variable_name
變量:&variable_name or &&variable_name
3.在sql*plus中,可以定義同名的綁定變量與用戶變量,但是引用的方法不同。
綁定變量不同於變量:
1. 定義方法不同
2. 引用方法不同
綁定變量::variable_name
變量:&variable_name or &&variable_name
3.在sql*plus中,可以定義同名的綁定變量與用戶變量,但是引用的方法不同。
39. &與&&的區別
&用來創建一個臨時變量,每當遇到這個臨時變量時,都會提示你輸入一個值。
&&用來創建一個持久變量,就像用用define命令或帶new_vlaue字句的column命令創建的持久變量一樣。當用&&命令引用這個變量時,不會每次遇到該變量就提示用戶鍵入值,而只是在第一次遇到時提示一次。
&用來創建一個臨時變量,每當遇到這個臨時變量時,都會提示你輸入一個值。
&&用來創建一個持久變量,就像用用define命令或帶new_vlaue字句的column命令創建的持久變量一樣。當用&&命令引用這個變量時,不會每次遇到該變量就提示用戶鍵入值,而只是在第一次遇到時提示一次。
如,將下面三行語句存為一個腳本文件,運行該腳本文件,會提示三次,讓輸入deptnoval的值:
select count(*) from emp where deptno = &deptnoval;
select count(*) from emp where deptno = &deptnoval;
select count(*) from emp where deptno = &deptnoval;
select count(*) from emp where deptno = &deptnoval;
select count(*) from emp where deptno = &deptnoval;
select count(*) from emp where deptno = &deptnoval;
將下面三行語句存為一個腳本文件,運行該腳本文件,則只會提示一次,讓輸入deptnoval的值:
select count(*) from emp where deptno = &&deptnoval;
select count(*) from emp where deptno = &&deptnoval;
select count(*) from emp where deptno = &&deptnoval;
select count(*) from emp where deptno = &&deptnoval;
select count(*) from emp where deptno = &&deptnoval;
select count(*) from emp where deptno = &&deptnoval;
40.在輸入sql語句的過程中臨時先運行一個sql*plus命令(摘自
www.itpub.com
)
#
有沒有過這樣的經歷? 在sql*plus中敲了很長的命令后, 突然發現想不起某個列的名字了, 如果取消當前的命令,待查詢后再重敲, 那太痛苦了. 當然你可以另開一個sql*plus窗口進行查詢, 但這里提供的方法更簡單.
#
有沒有過這樣的經歷? 在sql*plus中敲了很長的命令后, 突然發現想不起某個列的名字了, 如果取消當前的命令,待查詢后再重敲, 那太痛苦了. 當然你可以另開一個sql*plus窗口進行查詢, 但這里提供的方法更簡單.
比如說, 你想查工資大於4000的員工的信息, 輸入了下面的語句:
SQL> select deptno, empno, ename
2 from emp
3 where
這時, 你發現你想不起來工資的列名是什么了.
2 from emp
3 where
這時, 你發現你想不起來工資的列名是什么了.
這種情況下, 只要在下一行以#開頭, 就可以執行一條sql*plus命令, 執行完后, 剛才的語句可以繼續輸入
SQL>> select deptno, empno, ename
2 from emp
3 where
6 #desc emp
Name Null? Type
----------------------------------------- -------- --------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
2 from emp
3 where
6 #desc emp
Name Null? Type
----------------------------------------- -------- --------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
6 sal > 4000;
DEPTNO EMPNO ENAME
---------- ---------- ----------
10 7839 KING
---------- ---------- ----------
10 7839 KING
41. SQLPlus中的快速復制和粘貼技巧(摘自
www.cnoug.org
)
1) 鼠標移至想要復制內容的開始
2) 用右手食指按下鼠標左鍵
3) 向想要復制內容的另一角拖動鼠標,與Word中選取內容的方法一樣
4) 內容選取完畢后(所選內容全部反顯),鼠標左鍵按住不動,用右手中指按鼠標右鍵
5) 這時,所選內容會自動復制到SQL*Plus環境的最后一行
1) 鼠標移至想要復制內容的開始
2) 用右手食指按下鼠標左鍵
3) 向想要復制內容的另一角拖動鼠標,與Word中選取內容的方法一樣
4) 內容選取完畢后(所選內容全部反顯),鼠標左鍵按住不動,用右手中指按鼠標右鍵
5) 這時,所選內容會自動復制到SQL*Plus環境的最后一行
/**********************************************************************************/
關於FORMAT的提示:
¨ 文字各式的設置,用A[n]來表示,n表示顯示的長度。那么這個文字列的顯示長度就按照N個字符的寬度,如果內容>N,就會自動轉行。如圖2
¨ 日期格式,sqlplus缺省顯示的日期格式按照nls_lang設置來顯示。缺省是A9。那么,你可以通過設置數據庫啟動參數,或者sqlplus的環境變量,或者用alter session命令來規范日期的顯示;也可以通過to_char來轉換顯示內容;也可以用column命令來指定顯示長度。
¨ 數字格式,說明一些常用的符號。如圖3
9 代表一個數字字符
0 在指定的位置顯示前導0或后置0
$ 美元貨幣符號
B 顯示一個空,如果是0的話
MI 顯示負號,如果小於0的話
, 顯示千分位分隔符
. 顯示小數點
G 和,一樣,顯示千分位分組符號
L 顯示本地區域的貨幣符號
熟悉oracle的朋友都知道,SQL PLUS是一個重要的和ORACLE打交道的工具。
SQL PLUS本身有很多命令,可以幫助我們做很多事情,
包括產生一些規格化的報表、提供人機交互等等。下面,我就簡單地說明一下,
供大家參考:
/***********************************************************************/
一 幫助命令
SQL PLUS本身有很多命令,可以幫助我們做很多事情,
包括產生一些規格化的報表、提供人機交互等等。下面,我就簡單地說明一下,
供大家參考:
/***********************************************************************/
一 幫助命令
HELP可以幫助我們,查找SQL PLUS每個命令的用法
舉例:
SQL> help accept
ACCEPT
------
Reads a line of input and stores it in a given user variable.
ACC[EPT] variable [NUM[BER] | CHAR | DATE] [FOR[MAT] format]
[DEF[AULT] default] [PROMPT text | NOPR[OMPT]] [HIDE]
二 SQLPLUS的人機交互命令
在SQLPLUS里可以接受用戶的輸入,最常用的命令有:
(1) ACCEPT
接受整行的數據。
語法:ACC[EPT] variable [NUM[BER]|CHAR|DATE] [FOR[MAT] format]
[DEF[AULT] default] [PROMPT text|NOPR[OMPT]] [HIDE]
舉例說明:
[DEF[AULT] default] [PROMPT text|NOPR[OMPT]] [HIDE]
舉例說明:
角本1.sql,查出工資大於輸入金額的雇員。
SET FEEDBACK OFF
SET PAUSE OFF
ACCEPT sal NUMBER PROMPT 'Please input salary(weekly): '
select employee_id,last_name,first_name,salary from employee
where salary>&sal;
在SQLPLUS 中運行
SQL> @c:\1.sql
Please input salary(weekly): 1000
old 2: where salary>&sal
new 2: where salary> 1000
EMPLOYEE_ID LAST_NAME FIRST_NAME SALARY
----------------- ------------------- ----------------------------- ----------
7499 ALLEN KEVIN 1600
7505 DOYLE JEAN 2850
7506 DENNIS LYNN 2750
7507 BAKER LESLIE 2200
7521 WARD CYNTHIA 1250
7555 PETERS DANIEL 1250
7557 SHAW KAREN 1250
7560 DUNCAN SARAH 1250
7564 LANGE GREGORY 1250
7566 JONES TERRY 2975
7569 ALBERTS CHRIS 3000
注:
① ACCEPT接受一行的輸入,並且把輸入的數據根據指定按照指定的類型存放到變量
(如不存在,自動創建一個)中。
(如不存在,自動創建一個)中。
② FOMRAT用於制定輸入的數據格式,如數字可以指定’999.99’,字符可以指定長度’A10’
③ 如果類型是CHAR,長度最大240。
(2) PROMPT
輸出提示信息。
語法:PRO[MPT] [text]
舉例:
SQL> PROMPT Hello,world
Hello,world
(3) PAUSE
輸出一行信息,並等待用戶輸入回車。
語法:PAU[SE] [text]
舉例:
舉例:
SQL> PAUSE Please press [RETURN]
Please press [RETURN]
SQL>
三 編輯命令
通過SQL PLUS發送的最后一次SQL語句都會保存在SQL PLUS的一個數據緩沖區內,
而SQLPLUS命令不包括在內可以通過編輯命令進行編輯。
而SQLPLUS命令不包括在內可以通過編輯命令進行編輯。
(1) /
重新執行一下sql 語句。
(2) APPEND
在命令緩沖區內,追加字符。
舉例:
SQL> select * from tab;
….
SQL> A WHERE tabtype='VIEW'
1* select * from tabwhere tabtype='VIEW'
SQL> /
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
PLSQL_PROFILER_GRAND_TOTAL VIEW
PLSQL_PROFILER_LINES_CROSS_RUN VIEW
PLSQL_PROFILER_NOTEXEC_LINES VIEW
PLSQL_PROFILER_UNITS_CROSS_RUN VIEW
SALES VIEW
(3) LIST或;
列出緩沖區內的內容,list可以列出某行的內容,而;則是所有的。
舉例:
SQL> ;
1 select * from tab WHERE tabtype='VIEW'
2* ORDER BY tname
SQL> l 2
2* ORDER BY tname
(4) INPUT
增加一行內容
舉例:
SQL> i ORDER BY tname
SQL> l
1 select * from tab WHERE tabtype='VIEW'
2* ORDER BY tname
(5) CHANGE
把當前行的第一個艘索到的內容替換新的內容,
語法:C[HANGE] sepchar old [sepchar [new[sepchar]]]
舉例:
SQL> l
1* select * from employee where salary>1000 and salary<2000
SQL> c/salary/sal
1* select * from employee where sal>1000 and salary<2000
注意,當緩沖區有兩行的時候,用C替換的是最后一行里的內容。
(6) Edit
在指定的文本編輯器里,編輯緩沖區的內容。Windows上,缺省是NOTEPAD。
(7) SPOOL
把輸出結果,指定到一個文件中,有點像DOS命令下的>
SPO[OL] [file_name[.ext] | OFF | OUT]
SQL> spool c:\1.txt
SQL> select * from tab;
SQL> spool off
四 執行命令
(1) @
載入角本,運行。
舉例:
SQL>@C:\1.SQL
(2) EXECUTE
運行PL/SQL過程和程序包。
/***************************************************************/
五 報表制作命令
/***************************************************************/
五 報表制作命令
報表制作命令是最重要的SQL*PLUS命令,也是DBA經常用到的。下面,就讓我簡單地說明一下。
(1) TTITLE命令
放置一個報表的標題。
語法:
TTITLE
------
Places and formats a title at the top of each report page.
Enter TTITLE with no clause to list its current definition.
The old form of TTITLE is used if only a single word or
a string in quotes follows the TTITLE command.
TTI[TLE] [printspec [text|variable] ...] | [ON|OFF]
where printspec is one or more of the following clauses:
COL n LE[FT] BOLD
S[KIP] [n] CE[NTER] FORMAT text
TAB n R[IGHT]
主要參數的說明:
¨ 報表標題的顯示的位置,有LEFT,CENTER決定
¨ 還可以使用用戶的變量(內容有系統來維護),如SQL.PNO頁號, SQL.LNO行號等等
¨ COL[N] 就是在第幾個字符位置開始顯示標題。
(2) COLUMN命令
這個命令主要用途,是規范查詢的結果的輸出格式。
輸出格式包括了數字也可以指定顯示的寬度。COLUMN設置后,一直保持有效。
除非,你重新使用COLUMN設置該列或者用COLUMN <column name> CLEAR。
輸出格式包括了數字也可以指定顯示的寬度。COLUMN設置后,一直保持有效。
除非,你重新使用COLUMN設置該列或者用COLUMN <column name> CLEAR。
語法:
COLUMN
------
Specifies display attributes for a given column, such as:
- column heading text
- column heading alignment
- NUMBER data format
- column data wrapping
Also lists the current display attributes for a single column
or all columns.
COL[UMN] [{column | expr} [option...] ]
where option is one of the following clauses:
ALI[AS] alias
CLE[AR]
ENTMAP {ON|OFF}
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT] | C[ENTER] | C[ENTRE] | R[IGHT]}
LIKE {expr | alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT] | PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED] | WOR[D_WRAPPED] | TRU[NCATED]
/*********************************************************************/
關於其他參數的提示
關於其他參數的提示
Justify主要規定了列顯示內容的對齊方式。Left ,right,center。
Like指定該列的顯示參照某個其他列的顯示方法。如:COLUMN COMM LIKE SAL
NEW LINE 換行顯示這個列的內容
NULL text 如果是null,顯示一個字符串,相當於ISNULL函數。
(3) Break命令
(3) Break命令
利用Break你可以打印出報表需要的一些內容,如小計,重復的列值不顯示,
或者每個分組插入一個空行等等。
或者每個分組插入一個空行等等。
清除break設置,clear breaks。
語法:
BREAK
-----
Specifies where and how to make format changes to a report.
BRE[AK] [ON report_element [action [action]]] ...
where report_element has the following syntax:
{column | expression | ROW | REPORT}
and where action has the following syntax:
[SKI[P] n | [SKI[P]] PAGE] [NODUP[LICATES] | DUP[LICATES]]
說明如下:
sql>break on deptno
得到的結果如圖4
/*********************************************************************/
圖4
/*********************************************************************/
圖4
通過對某個列設置break命令,我們去掉了重復顯示deptno的值。
請仔細對比一下沒有break的情況。這種用法稱為break column的用法。
BREAK命令中的列應該要出現在SQL語句的order by中,
如果order by中有多個列,也有多個列的break用法。
請仔細對比一下沒有break的情況。這種用法稱為break column的用法。
BREAK命令中的列應該要出現在SQL語句的order by中,
如果order by中有多個列,也有多個列的break用法。
Break參數的說明
¨ Skip[n],在每個分組值出現前,自動插入n個空行
¨ Skip page, 在每個分組值出現前,自動換頁
¨ BREAK ON ROW SKIP[n],每一行后面插入n個空行。
¨ Nodup重復的顯示空,dup重復的也顯示。
BREAK好比定義了一個事件,當值發生了變化后,可以對查詢的結果執行一個特定的操作。
BREAK和COMPUTE命令一起用,就可以產生小計等報表效果。
BREAK和COMPUTE命令一起用,就可以產生小計等報表效果。
/*************************************************************************/
圖5
圖5
(4) COMPUTE命令
在結果的最后顯示一行統計行。如果有多個COMPUTE,那么只有最后一個COMPUTE才起作用。Clear computes刪除所有設定的compute。
語法:
COMPUTE
-------
Calculates and prints summary lines, using various standard
computations, on subsets of selected rows. It also lists all
COMPUTE definitions.
COMP[UTE] [function [LAB[EL] text] ...
OF {expr|column|alias} ...
ON {expr|column|alias|REPORT|ROW} ...]
COMPUTE和BREAK一起使用的。沒有BREAK語句的COMPUTE沒有任何效果。一般的用法如下:
BREAK ON break_column
COMPUTE function LABEL label_name OF column column column
... ON break_column
COMPUTE執行的計算操作主要有:
SUM
Computes the sum of the values in the column.
MINIMUM
Computes the minimum value in the column.
MAXIMUM
Computes the maximum value in the column.
AVG
Computes the average of the values in the column.
STD
Computes the standard deviation of the values in the column.
VARIANCE
Computes the variance of the values in the column.
COUNT
Computes the number of non-null values in the column.
NUMBER
Computes the number of rows in the column.
/*********************************************************************/
Computes the sum of the values in the column.
MINIMUM
Computes the minimum value in the column.
MAXIMUM
Computes the maximum value in the column.
AVG
Computes the average of the values in the column.
STD
Computes the standard deviation of the values in the column.
VARIANCE
Computes the variance of the values in the column.
COUNT
Computes the number of non-null values in the column.
NUMBER
Computes the number of rows in the column.
/*********************************************************************/