Oracle SQL*PLUS基礎及sqlplus命令詳解-1

轉自:http://www.cnblogs.com/lds85930/archive/2008/07/07/1237523.html

Oracle SQL*PLUS基礎

Oracle的SQL*PLUS是設計所有應用系統的基礎工具。要想將應用系統設計成一個健壯的、性能優越的系統。最關鍵的是要理解RDBMS的真正含義和結構,理解Oracle SQL*PLUS 的特點和核心,弄清關係數據庫與桌面數據庫的差別。比如理解數據的完整性、一致性、索引、視圖等。只有這樣才能設計出符合Oracle特點的應用系統。從而保證系統在提供使用後不會出現一致性、性能等問題。
§1.1 理解關係數據庫系統(RDBMS)
CODASYL(數據系統語言協會)是數據庫任務組(Database Task Group,DBTG)創建的一種數據庫標準,這是一種基於COBOL的網絡數據庫標準。

§1.1.1 關係模型
一個描述兩個集合的元素如何相互聯繫或如何一一對應的數學概念,對於數據庫來說,關係只是一個帶有一些特殊屬性的表。所以有:

l 數據的基礎項是關係
l 在這些表上的操作只產生關係
一個關係表必須符合某些特定條件,才能成爲關係模型的一部分
l 儲存在單元中的數據必須是原子的。每個單元只能存儲一條數據,叫信息原則(Information Principle)。如果存儲多條則違反信息原則。特舒情況下可能需要違反信息原則。
l 儲存在列下的數據必須具有相同的數據類型。
l 每一行是唯一的(沒有完全相同的行)。
l 列沒有順序。
l 行沒有順序
l 列有一個唯一性的名稱。

關係模型的另一個是完整性原則。它包括實體完整性原則(Entity integrity rule)和引用完整性原則( Referential integrity rule ),如:
l 主鍵( Primary key )是能唯一標識行的一列或一組列的集合。
l 由多個列構成的主鍵稱爲連接鍵(Concatenated key)、組合鍵(Compound key ),或稱作爲複合鍵(Composity key )。

另外就是外部鍵(Foreign key )是一個表中的一列或一組列,它們在其它表中作爲主鍵而存在。一個表中的外部鍵被認爲是對另外一個表中主鍵的引用。實體完整性原則簡潔地表明主鍵不能全部或部分地空缺或爲空,引用完整性原則簡潔地表明一個外鍵必須爲空或者它所引用的主鍵當前存在值相一致。

§1.1.2 Codd十二法則
Oracle數據庫系統是一個完美的完全符合數據庫技術的關係數據庫系統。要想你的應用設計按照數據庫原理來進行,最重要的就是理解Oracle的結構、語句和命令。Codd提出的十二條法則在Oracle系統中都可以找到:

1) 信息法則。
2) 授權存儲法則,每一個數據項都通過“表名+行主鍵+列名”的組合形成訪問。
3) 必須以一致的方法使用空值。
4) 一個活躍的、在線數據字典應作爲關係型表被儲存
5) 必須提供數據存取語言進行存取訪問。
6) 所有能被更新的視圖應當是可被更新的。
7) 必須有集合級的插入、更新和刪除。
8) 物理數據的獨立性。即應用不依賴物理結構。
9) 邏輯數據的獨立性。如果一個表被分成兩個部分,則應用視圖連接在一起,以便不會對應用產生影響。
10) 完整性的獨立性。完整性規則應該儲存在數據字典中。
11) 分佈獨立性。一個數據庫即使被分佈,也應該能工作。
12) 非破壞性原則。如果允許低級存取,一定不能繞過安全性和完整性原則。

§1.2 關係數據庫系統(RDBMS)的組成
RDBMS由兩部分組成,即數據庫系統內核(軟件)和數據字典(內核用於管理數據庫系統的數據結構)兩部分。

§1.2.1 RDBMS 內核
RDBMS就是用來控制數據訪問的操作系統。它的任務是按照一定的規則存儲數據、檢索數據及保護數據。

§1.2.2 數據字典概念
數據自動存放數據庫中所有對象(如表,索引,視圖等)所需的信息。Oracle 8i 的數據字典是存放數據庫系統信息的一組表,從數據字典中的信息可以確認數據庫中數據對象的基本信息及存放位置。

§1.3 SQL、SQL*Plus及 PL/SQL
下面用簡單的語言解釋Oracle的常用產品所包含的SQL*PLUS和PL/SQL的關係。
§1.3.1 SQL和SQL*PLUS的差別
SQL是標準結構查詢語言,而SQL*PLUS實際是包括標準的SQL和Oracle公司的一些命令組成的產品,因而Oracle公司將其取名爲SQL*PLUS。下面是它們的解釋。

1. SQL(Structured Query Language)

SQL有許多關鍵字,以下語句是常用於開頭的語句:
Alter Insert 
Audit Lock 
Commit Noaudit
Comment Rename
Create Revoke
Delete Select
Drop Update
Grant Validate

注:
1.Oracle的SQL緩衝區一次只能存放一條SQL命令;
2.Validate (使生效) 在 oracle 中跟 Enable 一起用,但可以省去 Validate,所以許多資料都不介紹Validate 的用法。其語法如:
Enable{[Validate][Novalidate]} { [UNIQUE][PRIMARY KEY]... } ...

2. SQL*PLUS

除SQL外,SQL*PLUS還包括稱爲SQL*PLUS命令的附加命令,這些命令主要用於形成複雜報表,編輯SQL命令,提供幫助信息,維護系統等。SQL*PLUS包括的命令如下:

@ Connect
Host Set
# Copy
Input Show
$ Define
List Spool
/ Del 
Newpage Sqlplus
Accept Describe
Pause Start
Append Disconnect
Quit Timing
Break Document 
Remark Ttitle
Btitle Edit 
Prompt Undefine
Chang Execute
Print Save
Clear Exit
Run Column
Get Runform
Compute Help

3. DDL(Data Define Language)

對於結構查詢語言(有時稱SQL命令),可以將它們分成兩組,一組是數據定義語言(DDL);另一組是數據操縱語言(DML)。其中用於數據定義的語言如下:

Alter procedure 重編譯過程
Alter table 修改表的屬性
Analyze 統計數據庫對象性能值
Alter table add Constraint 對已有的表加約束
Create table 建立表結構
Create index 建立索引
Drop table 刪除表實體及相關的索引
Drop index 刪除索引
Grant 授權給用戶或角色
Truncate 刪除表中的所有行
Revoke 從用戶或角色收回權限

4.DML(Data Manipulation Language)

對於結構查詢語言的另一組是數據操縱語言(DML)。DML其中用於數據操縱的命令如下:

Insert
Delete
Update
Select
Commit work
Rollback

§1.3.2 PL/SQL語言
PL/SQL是Oracle RDBMS (Oracle 6 之後版本)的一個組成部分,PL 是“過程化語言(Procedure Language )”的縮寫。PL/SQL語言是在SQL語言中結合了結構化過程語言成分的準第四代語言。

使用PL/SQL的目的:
由於大多數PL/SQL是在服務端來運行,這樣可減少由客戶端運行程序時所需的網絡數據流量。
可以使用PL/SQL的地方:
l PL/SQL可以單獨進行程序的編寫,完成一般的處理功能;
l 在高級語言中可嵌入PL/SQL 塊;
l 在4GL中可以嵌入PL/SQL 塊;
l 在PL/SQL程序中可以嵌入 HTML和XML。

§1.4 登錄到SQL*PLUS
我們創建任何對象,如創建表、索引等都需要連接到Oracle中,這裏用“登錄”主要是Oracle的界面提供的是Login 這樣的叫法。其實就是連接的意思。在Client/Server結構下,Oracle提供兩種方式連接SQL*PLUS,其中SQL*NET V2.x 版本(目前版本不再使用SQL*NET V2.x)提供在字符方式下連接到 SQL*PLUS,SQL*NET V2. x版本提供在圖形方式(Window)使用,目前版本的 ORACLE8/8i 都使用 NET8 連接.(NET8 不再支持字符終端)

§1.4.1 UNIX環境
在UNIX下,要確保客戶端或服務器端與Oracle服務器系統進行連接,必須保證tnsnames.ora和listener.ora兩個參數文件的正確配置。詳細的配置解釋在DBA章節裏解釋。下面是tnsnames.ora和listener.ora兩個參數文件的內容顯示。

1. tnsnames.ora參數文件:
INST1_HTTP =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = s450)
(PRESENTATION = 
http://admin)
)
)

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

S450 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = s450)
)
)

2. listener.ora參數文件:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /home/oracle/app/oracle/product/8.1.7)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = s450)
(ORACLE_HOME = /home/oracle/app/oracle/product/8.1.7)
(SID_NAME = s450)
)
)

如果安裝後已經正確地對上面的兩個參數文件進行配置,則可以按照下面步驟進行登錄:

1)先啓動服務器端監聽器:
lsnrctl start

2)用下面命令顯式登錄到 SQL*PLUS:
$sqlplus username/password

$SQLPLUS username/password@connect_string

3)用下面命令隱式登錄到 SQL*PLUS:
$sqlplus [enter]
Enter user name:scott
Enter password:******

§1.4.2 Windows NT和WINDOWS/2000環境
在NT/2000環境下,要使客戶端能與Oracle服務器進行連接,tnsnames.ora和listener.ora參數文件的配置如下:

1. tnsnames.ora參數文件:

ORA816.TAIJI.COM.CN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = zhao)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora816)
)
)

EXTPROC_CONNECTION_DATA.TAIJI.COM.CN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
S450 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbsvr)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = s450)
)
)

2. listener.ora參數文件:

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = zhao)(PORT = 1521))
)
)
(DESCRIPTION =
(PROTOCOL_STACK =
(PRESENTATION = GIOP)
(SESSION = RAW)
)
(ADDRESS = (PROTOCOL = TCP)(HOST = zhao)(PORT = 2481))
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = ora816)
(ORACLE_HOME = D:\oracle)
(SID_NAME = ora816)
)
)

Windows NT/2000字符方式登錄步驟:
1)先啓動服務器端監聽器:
lsnrctl start

2)用下面命令顯式登錄到 SQL*PLUS:
$sqlplus username/password

$SQLPLUS username/password@connect_string

Windows NT/2000圖形方式登錄步驟:
1)點擊“開始”=》“程序”=》“Oracle –OraHome81”=》“Application on Development”=》“SQL Plus”進入如下屏幕:

在WINDOWS NT/98/2000上的登錄界面(sqlplus圖)

可以在用戶名框內輸入用戶、口令及主機字串;也可以分別進行輸入。

§1.5 常用SQL*PLUS 附加命令簡介
Oracle公司提供的附加語句(或稱命令),可以滿足程序人員和管理員的一些特殊操作要求。比如,在顯示超過上百行記錄信息時,可以採用每屏“暫停”來實現。要達到這樣的目的,就要在SQL>下發 set pause on 命令。由於SQL*PLUS命令較多,下面僅給出最常用的幾個命令的說明,詳細的請參考附錄。
§1.5.1 登錄到SQL*PLUS

可以用下面命令登錄到 SQL*PLUS,SQL*PLUS命令的簡單語法如下:

SQLPLUS [ [logon] | [start] ]

logon可以是:
{username[/password][@connect_identifier]|/} [AS {SYSOPER|SYSDBA}]
|/NOLOG

注1:SQLPLUS 主要是在命令方式下使用,在NT、WINDOWS/2000、UNIX的用法都一樣。
注2:如果在UNIX下,SQLPLUS命令不被識別(不存在),則問題在環境變量PATH沒有設置正確或者沒有設置。SQLPLUS 可執行程序在$ORACLE_HOME/bin 目錄下。

§1.5.2 EXIT和QUIT

可以用 exit 或quit 來終止SQL*PLUS的操作(會話)。語法如下:

{EXIT|QUIT} [SUCCESS|FAILURE|WARNING ] 

{EXIT|QUIT} 可以用exit 或quit ,目前它們的功能一樣。

SUCCESS 正常退出

FAILURE 帶提示錯誤代碼的退出

WARNING 帶提示警告代碼的退出

COMMIT 退出前將未提交進行保存

例如:
SQL>exit

§1.5.3 DESCRIBE(顯示錶、視圖結構)
DESCRIBE可以用(只要用DESC即可)來顯示錶、視圖的列的定義,也可以顯示同義詞、函數或存儲過程的說明。語法如下:

DESC[RIBE] {[schema.]object[@connect_identifier]}

Schema:用戶名,如果省去,則爲對象的所有者。

object
可以是 表(table), 視圖(view),類型( type), 存儲過程(procedure),函數( function), 包(package)或同義詞( synonym)

@connect_identifier
數據庫連接字串

例:顯示emp 表的結構:

SQL>desc emp

§1.5.4 LIST(列出)命令
可以用 LIST 命令來列出當前SQL緩衝區中的一行或多行命令語句。 

L[IST] [n|n m|n *|n LAST|*|* n|* LAST|LAST]

n 列出第n行
n m 列出n到m行
n * 列出第n行到當前行
n LAST 列出第n行到最末行
* 列出所有行
* n 列出當前行到第n行
* LAST列出當前行到最末行
LAST 列出最末行

例:
SQL> LIST
1 SELECT ENAME, DEPTNO, JOB
2 FROM EMP
3 WHERE JOB = ’CLERK’
4* ORDER BY DEPTNO

§1.5.5 Change(替換字符串)命令

可以用Change命令來改變字符串(即替換字符串)。語法如下:

C[HANGE] sepchar old [sepchar [new [sepchar]]]

Sepchar 爲分隔符,可以是”/” 或”!” -- 請使用者特別注意

Old 舊字串

New 新字串

例:將 除號(/)改爲 乘號( * ),則需要命令爲c !/!*! 。即:
SQL> l
1* select sal,sal/100 from emp
SQL> c !/!*!

提醒:對於修改 / 字符的只能用 ! 來作分隔符(上例)。

例:將乘號( * )改爲 加號( + ),則需要命令爲c !/!*! 。即:
SQL> l
1* select sal,sal*100 from emp
SQL> c/*/+/
1* select sal,sal+100 from emp
SQL>

§1.5.6 Append(追加字符串)命令

可以用 Append命令來完成在當前行的末尾追加字符串。語法如下:

A[PPEND] text

Text 所要求追加的字符串

例:在當前行select sal,sal+100 from emp 後加 where sal>=2000,則:

SQL> l
1* select sal,sal+100 from emp
SQL> a where sal>=2000
1* select sal,sal+100 from emp where sal>=2000
SQL>

§1.5.7 Save保存當前緩衝區命令到文件

可以用SAVE命令將當前的命令行保存到操作系統的文件中。語法如下:

SAV[E] filename[.ext] [CRE[ATE]|REP[LACE]|APP[END]]

其中:
filename:你將把緩衝區中的內容存入到操作系統目錄的文件名。
ext:若使用文件後綴,缺省的文件後綴爲SQL。

例:
SQL>select table_name from dict where table_name like ‘%ROLE%’;
SQL>save c:\get_role

§1.5.8 GET將命令文件讀到緩衝區
可以用GET 命令將操作系統的目錄下的命令文件讀到緩衝區(但不執行)。語法如下:

GET filename [.ext] [LIS[T]|NOL[IST]]
其中:
filename: 希望加載到SQL緩衝區的文件名
ext: 文件的擴展名,缺省爲 SQL.

例:

SQL>get c:\get_role

§1.5.9 SPOOL將信息記錄到文件中
Oracle的SPOOL 命令可以實現將屏幕所出現的一切信息記錄到操作系統的文件中直到SPOOL OFF爲止。語法如下:

SPO[OL] [filename[.ext] | OFF | OUT]
其中:
filename:你想輸出(spool)的文件名。
ext:文件的後綴。缺省的後綴是LST(或LIS)。

SQL>col table_name for a20
SQL>col comments for a80
SQL>set linesize 110
SQL>SPOOl c:\all_dict
SQL>select table_name,comments from dict;
. . . . . . (系統查詢信息)

SQL>SPOOL OFF

§1.5.10 再運行當前緩衝區的命令
在SQL>方式下,如果希望在運行當前的命令,可用Run(或R)或用 / 來實現,如:

SQL> set lin 120
SQL> select table_name from dict where table_name like '%ROLE%';

TABLE_NAME
------------------------------
DBA_ROLES
DBA_ROLE_PRIVS
USER_ROLE_PRIVS
ROLE_ROLE_PRIVS
ROLE_SYS_PRIVS
ROLE_TAB_PRIVS
SESSION_ROLES

已選擇7行。

SQL> l
1* select table_name from dict where table_name like '%ROLE%'
SQL> /

TABLE_NAME
------------------------------
DBA_ROLES
DBA_ROLE_PRIVS
USER_ROLE_PRIVS
ROLE_ROLE_PRIVS
ROLE_SYS_PRIVS
ROLE_TAB_PRIVS
SESSION_ROLES

已選擇7行。

§1.6 常用數據字典簡介
ORACLE 提供許多內部數據字典, 用以管理系統的各種信息和參數(即數據庫對象),下面列出幾個常用的數據字典供初學者參考,其它方面的數據字典將在DBA管理中介紹。

ORACLE 數據字典的命名說明:

USER 爲前綴----記錄用戶的所有對象信息
ALL 爲前綴----記錄包括 USER 記錄和授權給PUBLIC 或該用
戶的所有對象的信息。
DBA 爲前綴----記錄關於數據庫對象(非用戶對象)的信息。
V$ 公共系統動態視圖,用於系統優化和調整參考.
V_$ 動態性能視圖,你可用 CATALOG.SQL 腳本建立動態視圖建立同義詞。
GV$ 新(oracle 8)的附加的固定視圖(Global V$).在並行環境下反應的是
V$視圖的信息。如:

SELECT * FROM GV$LOCK WHERE INST_ID = 2 OR INST_ID = 5 ;

返回的是instances 2 和5的V$的信息。所以GV$反應一組Instances的參數. GV$視圖的限制是參數PARALLEL_MAX_SERVERS必須大於0 。
詳見 Oracle Enterprise Manager Administrator's Guide.

注:請注意下面的總結:
l 一般DBA_ 的視圖內容都包含USER_和ALL_爲前綴的視圖;
l DBA_爲前綴的視圖的內容基本上是大寫;
l 以V$_爲前綴的視圖的內容基本上是小寫。

1. USER_TABLEs(=TABS) 用戶的所有表的信息。
2.USER_TAB_COLUMNS(=COLS) 有關各表的列(字段)的信息
3.USER_VIEWS 用戶的所有視圖
4.USER_SYNONYMS(=SYN) 用戶同義詞
5.USER_SEQUENCES(=SEQ) 用戶序列
6.USER_CONSTRAINTS 記錄創建表結構時建立的限制。
7.USER_TAB_COMMENTS 表的註釋。如:

Comment on table emp is '職工表';

8. USER_COL_COMMENTS 列(字段)註釋。如:

Comment on column emp.ename is '姓名';

9. USER_INDEXES(=IND) 用戶索引的簡要信息
10. USER_IND_COLUMNS 用戶索引的列信息
11. USER_TRIGGERS 用戶觸發器信息
12. USER_SOURCE 用戶存儲過程
13. USER_TABLESPACE 用戶可以使用的表空間信息
14. USER_TS_QUOTAS 用戶使用系統資源的信息
15. USER_SEGMENTS 用戶對象所使用空間信息
16. USER_EXTENTS 用戶的擴展段信息
17. USER_OBJECTS 用戶對象
=USER_TABLES+USER_VIEWS+USER_INDEXES+
USER_SOURCE+USER_TRIGGERS+USER_JAVA

18. USER_PART_TABLES 用戶分區信息
19. USER_TAB_PARTITIONS
20. USER_PART_COL_STATISTICS
21. USER_IND_PARTITIONS
22. USER_FREE_SPACE
23. CAT(=USER_CATALOG) 用戶可以訪問的所有的基表。
24. TAB 用戶創建的所有基表,視圖,同義詞等。
25. DICT(=DICTIONARY) 構成數據字典的所有表的信息。

提示:雖然Oracle提供可以用Comment on column tablename.column is 'xxxx'; 等來實現對錶或列進行註釋,但不建議設計者採用這樣的工作方式。而建議將註釋寫到腳本中更爲直觀。

§1.7 ORACLE數據類型
Oracle數據庫的數據類型與其它的數據庫系統相比,它的數據類型不多,Oracle在表示數據方面比其他數據庫系統來說要省去許多關鍵字。Oracle只用NUMBER(m,n)就可以表示任何複雜的數字數據。其它如日期類型等也簡單得多,只DATE就表示日期和時間。下面以列表形式給出各個版本的Oracle系統數據類型的表示方法。下面給出Oracle舊版本的數據類型的目的是讓讀者瞭解Oracle的變化,另外就是你在對舊版本進行升級或數據轉換時要注意各個版本的差別。

ORACLE5、ORACLE6數據類型

數據類型 說明
Char 可變長字符型,≤254
Varchar2 可變長字符型,≤2000
Number(m,n) 數字類型,含整數、小數等
Date 日期型,含時間,缺省格式爲mmm-dd-yyyy hh:mi:ss(佔7字節)
Long 存儲大型可變長字符串,≤2GB
Raw 存儲短二進制串,≤2GB
Long raw 存儲長二進制串,≤2GB

ORACLE7數據類型

數據類型 說明
Char 定長字符,≤255個字符
Varchar 變長字符,≤2000個字符
Varchar2 變長字符,≤2000個字符
Number(m,n) 數字類型,含整數、浮點、雙精度等
Long 存儲大型可變長字符串,≤2GB
Raw 存儲可變短二進制數,≤2000
Long raw 存儲大型可變長二進制數,≤2GB

ORACLE8/8i 數據類型

數據類型 說明
Char 定長字符,≤2000個字符
Varchar (同Varchar2)可變字符,≤4000個字符
Varchar2 變長字符,≤4000個字符
Date 固定長度(7字節)的日期型
Number 數字型,可存放實型和整型
Long 可變字符,≤2GB個字符
Raw 可變二進制數據,≤4000字節
Long raw 可變二進制數據,≤2GB
MLSLABEL 僅Trusted Oracle 用長度在2~5字節間
Blob 大二進制對象,≤4GB
Clob 大字符串對象,≤4GB
Nclob 多字節字符集的Clob,≤4GB
Bfile 外部二進制文件,大小由OS決定

CHAR()
定長字符型(在Oracle5 、Oracle6 是變長),字符長度不夠自動在右邊加空格符號。當字符長度超出2000個則錯誤。不指定大小缺省爲 1。

VARCHAR()
可變字符型,當前與VARCHAR2()相同。

VARCHAR2()
可變字符型,當前與VARCHAR()相同。VARCHAR2 類型的字段(列)可存放4000個字符;但是VARCHAR2 變量可以存放32,767 個字符。大小必須指定。

NCHAR()和NVARCHAR2()
NCHAR 和NVARCHAR2 分別與 CHAR和VARCHAR2 有相同的大小。並用于于存放 National Language Support (NLS)數據,Oracle 允許以本地語言存放數據和查詢數據。
如果將列名聲明成NCHAR、NVARCHAR2這樣的類型,則insert和 select 等語句中的具體值前加N,不能直接按照普通字符類型進行操作。看下面例子:

SQL> create table nchar_tst(name nchar(6),addr nvarchar2(16),sal number(9,2));

表已創建。

SQL> insert into nchar_tst values(N'趙元傑',N'北京市海淀區',9999.99);

已創建 1 行。

SQL> select * from nchar_tst where name like N'趙%';

NAME ADDR SAL
------ ---------------- ----------
趙元傑 北京市海淀區 9999.99

SQL> select * from nchar_tst where name like '趙%';
select * from nchar_tst where name like '趙%'
*
ERROR 位於第 1 行:
ORA-12704: 字符集不匹配.

提示:雖然Oracle可以使用nchar, nvarchar2 類型來存放字符數據,但建議設計者不要使用NCHAR和NVARCHAR2。因爲CHAR和VARCHAR2就能存放漢字。

NUMBER(
,)

是數據的整數部分,是數據的精度(即小數)部分,注意,部分可以表示負的精度。用可以表示從小數點往右或往左保留多少位。如下表:

實際值 數據類型 存儲值
1234567.89 Number 1234567.89
1234567.89 Number(8) 1234568
1234567.89 Number(6) 出錯
1234567.89 Number(9,1) 1234567.9
1234567.89 Number(9,3) 出錯
1234567.89 Number(7,2) 出錯
1234567.89 Number(5,-2) 1234600
1234511.89 Number(5,-2) 1234500
1234567.89 Number(5,-4) 1230000
1234567.89 Number(*,1) 1234567.9

Sal number(7,2), --表示5位整數,2位小數.

DATE
Oracle 的日期型用7個字節表示,每個日期型包含如下內容:
l Century (世紀)
l Year (年)
l Month(月)
l Day (天)
l Hour (小時)
l Minute (分)
l Second (秒)

日期型字段有下面特點:

l 日期型字段的插入和更新可以數據型或字符並帶to_date 函數說明即可。
l 缺省的日期格式有NLS_DATE_FORMAT參數控制,它的缺省格式爲DD-MON-YY。
l 缺省的時間是夜裏 00:00:00 (即0點 0分0秒)。
l sysdate返回的是服務器的時間,見下面例子。
l 日期格式的顯示可以設置,見下面例子。
l 日期型可以運算,見下面例子。見下面例子。
l 世紀用cc 表示;年用yyyy表示,月用mm表示,日用dd表示,小時用hh24表示,分用mi表示,秒用ss表示。

例子:
SQL> create table save_info(per_id varchar2(20),name varchar2(20),tran_date date,
2 tran_val number(12,2));

表已創建。

SQL> insert into save_info values ( '110105540609811','趙元傑',
2 to_date('2001.06.18','yyyy.mm.dd'),12345.66);

已創建 1 行。

SQL> select * from save_info;

PER_ID NAME TRAN_DATE TRAN_VAL
-------------------- -------------------- ---------- ----------
110105540609811 趙元傑 18-6月 -01 1234.66

SQL> select per_id,name,to_char(tran_date,'yyyy/mm/dd'),tran_val from save_info;

PER_ID NAME TO_CHAR(TR TRAN_VAL
-------------------- -------------------- ---------- ----------
110105540609811 趙元傑 2001/06/18 12345.66

SQL> show parameter nls_date_format

NAME TYPE VALUE
------------------------------------ ------- ------------------------------
nls_date_format string

SQL> alter session set nls_date_format=
2 '"公元"yyyy"年"mm"月"dd"日"';

會話已更改。

SQL> select sysdate from dual;

SYSDATE
------------------
公元2001年05月18日

SQL> select to_char(sysdate,'cc yyyy.mm.dd') from dual;

TO_CHAR(SYSDA
-------------
21 2001.05.18

關於日期型的使用方法詳細請參考《Oracle8i National Language Support Guide》。

BLOB
大二進制對象,每條記錄可存儲達4GB的數據,詳細見後面章節。

CLOB
大字符對象,每條記錄可存儲達4GB的數據,詳細見後面章節。

BFILE
外部二進制文件,每條記錄可存儲達4GB的數據(與OS有關),詳細見後面章節。

RAW
非結構的二進制數據,這些數據不被數據庫系統解釋。RAW可以存儲達2,000字節。

LONGRAW
大的二進制類型數據,LONGRAW是非結構的二進制數據,這些數據不被數據庫系統解釋。LONGRAW可以存儲達2GB字節。LONGRAW不能被索引,而RAW可以被索引。

ROWID
ROWID在Oracle數據庫中是一個虛的列,即系統用的特殊的列,不是我們建立的列。用於對數據庫中的每條記錄進行定位。詳細見“Rowid的使用”章節。

UROWID
UROWID 是Universal ROWID 的意思。即全球ROWID,它支持邏輯和物理ROWID,也作爲外部表的(通過getway 訪問的非Oracle 表)的ROWID。UROWID類型可以存儲所有的ROWID類型的數據。

%TYPE類型的匹配:
books_printed number(6);
books_sold books_printed%TYPE;
books_sold的數據類型與book_printed的類型一致;
( %TYPE類型 在 PL/SQL中介紹 )。

空值與字符型、數字型的運算:
null + <數字>=null (空值+數字仍是空值)
null > <數字>=null (空值與數字比較結果爲空值)
null || '字符串' = 字符串

number類型與以下類型具有同等的值域:
DEC
Decimal
Double PREcision
Float
Integer
Int
Numeric
Real
Smallint

提示:雖然Oracle可以使用上面的子數據類型,但建議還是採用NUMBER(n,m)爲好。因爲如果使用子數據類型定義字段類型不當,可能引起數據在運算方面的問題。

Long數據類型的限制:
l select中可以用long;
l update中可以用select子句;
l insert中可以用Valus子句;
l 每個表只能允許一個long列;
l long列不能列出完整性約束(null、not null除外);
l long列不能被索引;
l 過程或存儲函數不能接收long型函數;
l 存儲函數不能返回long型值。

long 目前不能出現在以下情況中:
l select中的Where,Group by,order by,Connect by,distinct;
l 不能對long列作substr,instr;
l 表達式或條件;
l 子查詢或集合中不能用long;
l Create table ...as select 中不能用long;

§1.8 SQL 語句基礎
下面給出SQL語句的基本介紹,更詳細的描述見後面的章節。
§1.8.1 SQL語句所用符號

操作符 用途 例子
+ - 表示正數或負數,正數可省去 + -1234.56
+ 將兩個數或表達式進行相加 A=c+b
- 將兩個數或表達式進行相減 34-12
* 將兩個數或表達式進行相乘 12*34
/ 除以一個數或表達式 18*11
NULL 空值判斷 Where name is null;
|| 字符串連接 ‘101-’||tel_num
= 等於測試 Select * from emp where name=’趙元傑’;
!= 或<>或^= 不等於測試 Select * from emp where name !=’趙元傑’;
< 小於測試 Select * from emp Where sal < 5000;
> 大於測試 Select * from emp Where sal > 5000;
<= 小於等於測試 Select * from emp Where sal <= 5000;
>= 大於等於測試 Select * from emp Where sal >= 5000;
Not in 測試某值是否在一個指定的結果集中 Select name,addr from expertwhere local not in(‘北京’,’上海’);
ANY 將一個值與一組值進行比較,返回滿足條件的結果。必須跟!=,<,>,<=,>= select ename,sal from emp where sal<= any(select sal from emp where deptno=10)
SOME 同ANY,必須跟!=,<,>,<=,>= 
ALL 將一個值與一組值比較,返回滿足條件的所有列值。必須跟!=,<,>,<=,>= Select name,sal from empWhere sal<= all ( 500,800,1200);
Not betweenA and B 判斷某個值是否界於兩者之間。 Select name,sal from emp Where sal between 500 and 1200;
[not]exists 判斷某個列是否存在於一組值中。 select dname,deptno from dept where exists(select * from emp where dept.deptno=emp.deptno)
A[not]like b[Escape ‘char’] 比較兩個模式是否相似,當使用like 語句時Oracle不去訪問索引。 Select * from empWhere ename like ‘TH%’;
Is [not] null 測試值是否爲空。 Select ename,deptno from empWhere comm. Is null or comm.=0;
Not 對結果的否定。 Select * from empWhere sal not(sal<1000); 等價於select ename,sal from emp where sal>=1000;
AND 用於判斷兩個條件十分都滿足。 Select * from emp where Ename=’SIMTH’ and sal>=1000;
OR 用於判斷兩個條件中是否有一個滿足。 Select * from emp where Ename=’SIMTH’ or ename=’SCOTT’;
UNION 用於返回(組合)兩個查詢中所有唯一的行。 Select ename from emp unionSelect ename from emp;
UNION ALL 用於返回(組合)兩個查詢中所有所有的行。 
INTERSECT 用於返回兩個查詢中相同的行。 Select ename from emp1 intersect select ename from emp2;
MINUS 用於返回兩個查詢中的不同的行。 

§1.8.2 簡單select 查詢
當我們可以用SQL*PLUS登錄到SQL>下後,我們可以用DESC 顯示某表的結構,也可以用select 語句簡單查詢表中的一些列的內容。

例:要查詢EMP表中員工的姓名、工資及出生日期,則:

SQL>select ename, sal, hiredate from emp;

§1.9 僞列及僞表
Oracle系統爲了實現完整的關係數據庫功能,系統專門提供了一組稱爲僞列(Pseudocolumn)的數據庫列,這些列不是在建立對象(如建表)時由我們完成的,而是在我們建立對象時由自動Oracle完成的。Oracle目前有以下的僞列:

l CURRVAL and NEXTVAL 使用序列號的保留字
l LEVEL 查詢數據所對應的級
l ROWID 記錄的唯一標識
l ROWNUM 限制查詢結果集的數量

有關僞列的詳細解釋和使用見相關章節。

Oracle 還提供了一個DUAL 的僞表,該表主要目的是保證在使用SELECT 語句中語句的完整性而提供的,如:我們要查詢當前的系統日期及時間,而系統的日期和時間並是放在一個指定的表裏。所以在 from 語句後就沒有表名給出。爲了使用 from 後有個表名,我們就用DUAL代替。如:

例1:查詢Oracle系統日期及時間:
SQL> select to_char( sysdate,'yyyy.mm.dd hh24:mi:ss') from DUAL;

TO_CHAR(SYSDATE,'YY
-------------------
2001.06.02 07:28:09

例2:計算一下 5000+5000*0.1 的結果是多少,則:
SQL> select 5000+5000*0.1 from DUAL;

5000+5000*0.1
-------------------
5500

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章