oracle 學習

1個oracle ——1個數據庫——多個數據表(數據對象)——多個用戶

注:默認會創建 SYS SYSTEM ,同時 Oracle 爲程序測試提供了一個普通用戶 scott. 默認的用戶中, SYS SYSTEM 用戶是沒有鎖定的,安裝成功後可以直接使用, SCOTT 用戶默認爲鎖定狀態,因此不能直接使用,需要把 SCOTT 用戶設定爲非鎖定狀態才能正常 使用.


一、鏈接數據庫:

1.使用sqlplus /nolog(啓動一個客戶端進程)

      conn 用戶名/密碼 as 連接身份@服務器連接字符串

其中鏈接身份:sys 用戶只能使用 sysdba 身份登錄,而 system 可以用普通用戶登錄

連接身份:表示該用戶連接後擁有的權限

sysdba: 即數據庫管理員, 權限包括: 打開數據庫服務器、 關閉數據庫服務
器、 備份數據庫、 恢復數據庫、 日誌歸檔、 會話限制、 管理功能、 創建數據庫。
sys 用戶必須用 sysdba 身份才能登錄, system 用戶可以用普通身份登錄。
sysyoper: 即數據庫操作員, 權限包括: 打開數據庫服務器、 關閉數據庫服務
器、 備份數據庫、 恢復數據庫、 日誌歸檔、 會話限制。

normal: 即普通用戶, 權限只有查詢某些數據表的數據。默認的身份是 normal


network/ADMIN/ tnsnames.ora:

詳情見附件


配置本地網絡服務名:

本地網絡服務名,即客戶端與服務器的連接字符串,本地網絡服務名是客戶端的配置,Oracle 客戶端安裝後,可以使用客戶端自帶的網絡配置嚮導( Net Configuration Assistant)進行配置:

2.PL/SQL Developer 工具


二、ORACLE 服務

     1). OracleService+服務名 數據庫服務器基本啓動服務

     2). OracleOraDb10g_home1TNSListener  服務器監聽客戶端的服務

     3).OracleOraDb10g_home1iSQL*Plus   使用瀏覽器進行遠程登錄操作數據庫服務(http://localhost:5560/isqlplus)

            4).   OracleDBConsole+服務名    基於 B/S 的企業管理器   輸入命令:emctl start  dbconsole ,獲取 B/S 地址


三、數據庫啓動跟關閉

     sqlplus 中 只能以 sys 用戶啓動 startup open  /   shutdown immediate


四、用戶和權限

      CREATE USER 用戶名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK]   默認爲鎖定狀態,需要給用戶賦予  CREATE SESSION 權限才能登錄

     權限舉例: CONNECT, RESOURCE, DBA

        授權語句:  GRANT角色|權限 TO 用戶(角色) :GRANT CONNECT TO jerry;

      回收權限 REVOKE 角色|權限 FROM 用戶(角色)

    修改密碼:  ALTER USER 用戶名 IDENTIFIED BY 新密碼

   修改鎖定狀態 ALTER USER 用戶名 ACCOUNT LOCK|UNLOCK


五、數據類型

      1). CHAR(length) : 存儲固定長度 length 

        2).  VARCHAR2(length) : 存儲變長字符串 length 爲最大長度

        3).  NUMBER(ps) : p 爲整數長度,s 爲小數長度

        4).  Date  年月日,時分秒,可以通過 sysdate 函數返回數據

        5).  TIMESTAMP 不但存儲日期的年月日,時分秒,以及秒後 6 位,同時包含時區,可以通過 systimestamp函數返回數據

      6). CLOB(大文件,ex: xml),BLOB (二進制文件)


六、創建表和約束

     1)、

     ALTER TABLE 表名 ADD CONSTRAINT 約束名 約束內容

     主鍵: ALTER TABLE INFOS ADD CONSTRAINT PK_INFOS PRIMARY KEY(STUID)

     驗證: ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_GENDER CHECK(GENDER = '' OR GENDER = '')

     唯一: ALTER TABLE INFOS ADD CONSTRAINTS UN_STUNAME UNIQUE(STUNAME)

     外鍵: ALTER TABLE SCORES ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES INFOS(STUID)


     2)、

     複製表結構: CREATE TABLE INFOS2 AS SELECT * FROM INFOS WHERE 1=2;

     若需插入數據: CREATE TABLE INFOS2 AS SELECT * FROM INFOS;

     插入數據的時候要插入時間 date : TO_DATE('2009-8-9 06:30:10',' YYYY-MM-DD HH24:MI:SS ')

     

     3)、

     刪除數據: TRUNCATE TABLE 表名 爲DDL命令,數據不能恢復;delete 爲 DML 命令,數據可以通過日誌文件恢復


   4)、

   查詢的時候字符串鏈接: 字符串的連接用雙豎線( ||)表示

   消除重複: SELECT DISTINCT DEPTNO FROM EMP

     LIKE: '%30\%%' escape '\'  (包含“ 30%”的字符串,“ \”指轉義字符,“ \%”在字符串中

表示一個字符“ %”)

     ANY: SELECT ENAME,JOB,SAL FROM EMP

               WHERE SAL<ANY (SELECT SAL FROM EMP WHERE JOB='SALESMAN')

       ALL: SELECT ENAME,JOB,SAL FROM EMP

               WHERE SAL>ALL (SELECT SAL FROM EMP WHERE JOB='SALESMAN')

  ROWID,ROWNUM: SELECT ROWNUM,ENAME,JOB,SAL FROM EMP WHERE ROWNUM<=5;


     5)、 集合運算

       INTERSECT(交集), 返回兩個查詢共有的記錄。

   UNION ALL(並集),返回各個查詢的所有記錄,包括重複記錄。

   UNION(並集),返回各個查詢的所有記錄,不包括重複記錄。

    MINUS(補集),返回第一個查詢檢索出的記錄減去第二個查詢檢索出的記錄之後剩餘的記錄。

    6)、

         內聯接: SELECT e.ENAME,e.JOB,e.SAL,d.DNAME

                         FROM EMP e INNER JOIN DEPT d ON e.DEPTNO=d.DEPTNO

                      其中 INNER 可以省略

                 外聯接: SELECT e.ENAME,e.JOB,e.SAL,d.DNAME

                         FROM EMP e RIGHT OUTER JOIN DEPT d ON e.DEPTNO=d.DEPTNO

                      其中 OUTER 可以省略


七、函數

字符串:

示例                                                        示例結果

SELECT ASCII('a') FROM DUAL                                                             97

SELECT CONCAT('Hello', ' world') FROM DUAL                                      Hello world

SELECT INSTR('Hello world' 'or') FROM DUAL                                    8

SELECT LENGTH('Hello') FROM DUAL                                                    5

SELECT LOWER('hElLO') FROM DUAL;                                                  hello

SELECT UPPER('hello') FROM DUAL                                                      HELLO

SELECT LTRIM('===HELLO===', '=') FROM DUAL                                 HELLO===

SELECT '=='||LTRIM(' HELLO===') FROM DUAL                                    ==HELLO===

SELECT RTRIM('===HELLO===', '=') FROM DUAL                                 ===HELLO

SELECT '='||TRIM(' HELLO ')||'=' FROM DUAL                                       =HELLO=

SELECT TRIM('=' FROM '===HELLO===') FROM DUAL                          HELLO

SELECT REPLACE('ABCDE','CD','AAA') FROM DUAL                               ABAAAE

SELECT SUBSTR('ABCDE',2) FROM DUAL                                              BCDE

SELECT SUBSTR('ABCDE',2,3) FROM DUAL                                           BCD


數字:

函數           說明                     示例

ABS(x) x            絕對值                          ABS(-3)=3

ACOS(x)            x 的反餘弦                      ACOS(1)=0

COS(x)             餘弦                            COS(1)=1.57079633

CEIL(x)           大於或等於x 的最小值             CEIL(5.4)=6

FLOOR(x)           小於或等於 x 的最大值          FLOOR(5.8)=5

LOG(x,y)      x 爲底 y 的對數                    LOG(2,4)=2

MOD(x,y)      x 除以 y 的餘數                    MOD(8,3)=2

POWER(x,y)      x y 次冪                     POWER(2,3)=8

ROUND(x[,y])      x 在第 y 位四捨五入            ROUND(3.456,2)=3.46

SQRT(x)           x 的平方根                       SQRT(4)=2

TRUNC(x[,y])      x 在第 y 位截斷                TRUNC(3.456,2)=3.45


說明:
1. ROUND(X[,Y]),四捨五入。
在缺省 y 時,默認 y=0;比如: ROUND(3.56)=4
y 是正整數,就是四捨五入到小數點後 y 位。 ROUND(5.654,2)=5.65
y 是負整數,四捨五入到小數點左邊|y|位。 ROUND(351.654,-2)=400
2. TRUNC(x[,y]),直接截取,不四捨五入。
在缺省 y 時,默認 y=0;比如: TRUNC (3.56)=3
y 是正整數,就是四捨五入到小數點後 y 位。 TRUNC (5.654,2)=5.65

y 是負整數,四捨五入到小數點左邊|y|位。 TRUNC (351.654,-2)=300


日期:

1. ADD_MONTHS(d,n),在某一個日期 d 上,加上指定的月數 n,返回計算後的新日期。

d 表示日期, n 表示要加的月數。

2. LAST_DAY(d),返回指定日期當月的最後一天。

3. ROUND(d[,fmt]),返回一個以 fmt 爲格式的四捨五入日期值, d 是日期, fmt 是格式

模型。默認 fmt DDD,即月中的某一天。

    如果 fmt 爲“ YEAR”則舍入到某年的 1 1 日,即前半年捨去,後半年作爲下
一年。
    如果 fmt 爲“ MONTH”則舍入到某月的 1 日,即前月捨去,後半月作爲下一
月。
    默認爲“ DDD”,即月中的某一天,最靠近的天,前半天捨去,後半天作爲第
二天。
    如果 fmt 爲“ DAY”則舍入到最近的周的週日,即上半周捨去,下半周作爲下

一週週日。

ROUND 對應的函數時 TRUNC(d[,fmt])對日期的操作, TRUNC ROUND 非常相似,只

是不對日期進行舍入,直接截取到對應格式的第一天。

4. EXTRACT(fmt FROM d),提取日期中的特定部分。
fmt 爲: YEARMONTHDAYHOURMINUTESECOND。其中 YEARMONTHDAY
可以爲 DATE 類型匹配,也可以與 TIMESTAMP 類型匹配;但是 HOURMINUTESECOND

須與 TIMESTAMP 類型匹配。


轉換函數:

1)、

SELECT TO_CHAR(SYSDATE,'YYYY""MM""DD"" HH24:MI:SS') "date"


2)、

SQL> SELECT TO_CHAR(-123123.45,'L9.9EEEEPR') "date"

2 FROM DUAL
3 /
date
--------------------

<1.2E+05>


3)、

SQL> SELECT TO_NUMBER('-$12,345.67','$99,999.99') "NUM"

2 FROM DUAL
3 /
NUM
---------------

-12345.67


其他單行函數:

1. NVL(x,value)

如果 x 爲空,返回 value,否則返回 x

2. NVL2(x,value1,value2)

如果 x 非空,返回 value1,否則返回 value2


聚合函數:

名稱      作用                語法

AVG                平均值                AVG(表達式)

SUM                求和                  SUM(表達式)

MINMAX      最小值、最大值      MIN(表達式)MAX(表達式)

COUNT           數據統計              COUNT(表達式)


八、數據庫對象

同義詞:

案例:創建一個用戶 XiaoMei,該用戶擁有 CONNECT 角色和 RESOURCE 角色。爲 SCOTT

用戶的 EMP 表創建同義詞,並通過同義詞訪問該 EMP 表。

SQL> CONN system/manager@orcl;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as system
SQL> CREATE USER XiaoMei IDENTIFIED BY XiaoMei;
User created
SQL> GRANT CONNECT TO XiaoMei;
Grant succeeded
SQL> GRANT RESOURCE TO XiaoMei;
Grant succeeded
SQL> GRANT CREATE SYNONYM TO XiaoMei;
Grant succeeded
SQL> CONN XiaoMei/XiaoMei@ORCL;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as XiaoMei
SQL> CREATE SYNONYM MyEmp FOR SCOTT.EMP;
Synonym created
SQL> SELECT * FROM MYEMP;
SELECT * FROM MYEMP
ORA-00942: 表或視圖不存在
SQL> CONNECT SCOTT/tiger@ORCL //連接到Scott
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as SCOTT
SQL> GRANT ALL ON EMP TO XiaoMei;
Grant succeeded
SQL> CONNECT XiaoMei/XiaoMei@ORCL;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as XiaoMei

SQL> SELECT ENAME,JOB,SAL FROM MyEmp WHERE SAL>2000;


DROP [PUBLIC] SYNONYM [schema.]sysnonym_name
語法解析:
PUBLIC:刪除公共同義詞。
② 同義詞的刪除只能被擁有同義詞對象的用戶或者管理員刪除。

③ 此命令只能刪除同義詞,不能刪除同義詞下的源對象。


序列號:

語法結構:創建序列
CREATE SEQUENCE sequence_name
[START WITH num]
[INCREMENT BY increment]
[MAXVALUE num|NOMAXVALUE]
[MINVALUE num|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE num|NOCACHE]
語法解析:
START WITH:從某一個整數開始,升序默認值是 1,降序默認值是-1
INCREMENT BY:增長數。如果是正數則升序生成,如果是負數則降序生成。升序默
認值是 1,降序默認值是-1
MAXVALUE:指最大值。
NOMAXVALUE:這是最大值的默認選項,升序的最大值是: 1027,降序默認值是-1
MINVALUE:指最小值。
NOMINVALUE:這是默認值選項,升序默認值是 1,降序默認值是-1026
CYCLE:表示如果升序達到最大值後,從最小值重新開始;如果是降序序列,達到最
小值後,從最大值重新開始。
NOCYCLE:表示不重新開始,序列升序達到最大值、降序達到最小值後就報錯。默
NOCYCLE
CACHE:使用 CACHE 選項時,該序列會根據序列規則預生成一組序列號。保留在內
存中,當使用下一個序列號時,可以更快的響應。當內存中的序列號用完時,系統
再生成一組新的序列號,並保存在緩存中,這樣可以提高生成序列號的效率。 Oracle

默認會生產 20 個序列號。


案例:創建一個從 1 開始,默認最大值,每次增長 1 的序列,要求 NOCYCLE,緩存中

30 個預先分配好的序列號。
代碼演示:生成序列號
SQL> CREATE SEQUENCE MYSEQ
2 MINVALUE 1
3 START WITH 1
4 NOMAXVALUE
5 INCREMENT BY 1
6 NOCYCLE
7 CACHE 30

8 /


序列創建之後,可以通過序列對象的 CURRVAL NEXTVAL 兩個“僞列” 分別訪問該序

列的當前值和下一個值。


代碼演示:序列修改和刪除
SQL> ALTER SEQUENCE MYSEQ
2 MAXVALUE 10000
3 MINVALUE -300
4 /
SEQUENCE ALTERED
SQL> DROP SEQUENCE MYSEQ;

SEQUENCE DROPPED



視圖:

索引:

表空間:

語法結構:創建表空間
CREATE TABLESPACE 空間名稱
DATAFILE '文件名1' SIZE 數字M
[,'文件名2' SIZE 數字….]
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 數字M
語法解析:
1. 文件名包括完整路徑和文件名,每個數據文件定義了文件的初始大小,初始大小一
般以“ M”爲單位。一個表空間中可以有多個數據文件。
2. EXTENT MANAGEMENT LOCAL 指明表空間類型是: 本地管理表空間。本地管理表空
間要求 Oracle 中的數據分區( Extent) 大小統一。

3. UNIFORM SIZE:指定每個分區的統一大小。


代碼演示:爲某一用戶指定默認表空間
SQL> CREATE USER ACONG IDENTIFIED BY ACONG
2 DEFAULT TABLESPACE MYSPACE

3 /


代碼演示:爲表指定表空間
SQL> CREATE TABLE SCORES
2 (
3 ID NUMBER ,
4 TERM VARCHAR2(2),
5 STUID VARCHAR2(7) NOT NULL,
6 EXAMNO VARCHAR2(7) NOT NULL,
7 WRITTENSCORE NUMBER(4,1) NOT NULL,
8 LABSCORE NUMBER(4,1) NOT NULL
9 )
10 TABLESPACE MYSPACE

11 /


代碼演示:爲索引指定表空間
SQL> CREATE INDEX UQ_ID ON SCORES(ID)

2 TABLESPACE MYSPACE;


九、數據庫導入與導出

代碼演示:exp 的交互環境
D:\>exp scott/tiger@my_orcl
Export: Release 10.2.0.3.0 - Production on 星期一 1019 17:04:14 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
連接到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
輸入數組提取緩衝區大小: 4096 >
導出文件: EXPDAT.DMP > scott.dmp
(2)U(用戶), (3)T(): (2)U > 2
導出權限 (yes/no): yes > yes
導出表數據 (yes/no): yes > yes

壓縮區 (yes/no): yes > no


參數名           說明

USERID                          表示“用戶名/密碼”。

BUFFER                          數據緩衝區大小。以字節爲單位,一般在 64000 以上。

FILE                               指定輸出文件的路徑和文件名。一般以.dmp 爲後綴名,注意該文件包括完整路徑,但是                         路徑必須存在,導出命令不能自動創建路徑。

COMPRESS                     是否壓縮導出,默認 yes

GRANTS                          是否導出權限,默認 yes

INDEXES                          是否導出索引,默認 yes

DIRECT                          是否直接導出,默認情況,數據先經過 Oracle 的數據緩衝區,然後再導出數據。

               

LOG                               指定導出命令的日誌所在的日誌文件的位置。

ROWS                          是否導出數據行,默認導出所有數據。

CONSTRAINTS                是否導出表的約束條件,默認 yes

PARFILE                          可以把各種參數配置爲一個文本鍵值形式的文件,該參數可以指定參數文件的位置。

TRIGGERS                     是否導出觸發器,默認值是 yes

TABLES                          表的名稱列表,導出多個表可以使用逗號隔開。

TABLESPACES                導出某一個表空間的數據。

Owner                          導出某一用戶的數據。

Full                               導出數據庫的所有數據。默認值是 no


IMP 程序導入就是把 Exp 導出的文件重新導入到數據庫的過程。導入時也有一些重要的
參數:
1.Fromuser:指出導出時 dmp 文件中記載的用戶信息。
2.Touser:dmp 文件要導入到什麼目標用戶中。
3.Commit:默認是 N,在緩衝區滿時是否需要 commit,如果設爲 N,需要較大的回滾段。
4.Igore: Oracle在恢復數據的過程中,當恢復某個表時,該表已經存在,就要根據 ignore
參數的設置來決定如何操作。若 ignore=yOracle 不執行 CREATE TABLE 語句,直接
將數據插入到表中,如果插入的記錄違背了約束條件,比如主鍵約束,則出錯的記
錄不會插入,但合法的記錄會添加到表中。若 ignore=nOracle 不執行 CREATE TABLE
語句,同時也不會將數據插入到表中,而是忽略該表的錯誤,繼續恢復下一個表。

代碼演示:Imp 導入

D:\>imp system/manager file=employee.dmp fromuser=scott touser=employee

commit=y


IMP常見問題

      一、數據庫對象已經存在
一般情況, 導入數據前應該徹底刪除目標數據下的表, 序列, 函數/過程,觸發器等。
數據庫對象已經存在, 按缺省的 imp 參數, 則會導入失敗。
如果用了參數 ignore=y, 會把 exp 文件內的數據內容導入。
如果表有唯一關鍵字的約束條件, 不合條件將不被導入。
如果表沒有唯一關鍵字的約束條件, 將引起記錄重複。
   二、數據庫對象有主外鍵約束
不符合主外鍵約束時, 數據會導入失敗。
解決辦法: 先導入主表, 再導入依存表。
disable 目標導入對象的主外鍵約束, 導入數據後, 再 enable 它們。
   三、權限不夠
如果要把 A 用戶的數據導入 B 用戶下, A 用戶需要有 imp_full_database 權限。
   四、導入大表( 大於 80M ) 時, 存儲分配失敗
默認的 EXP 時, compress = Y, 也就是把所有的數據壓縮在一個數據塊上。
導入時, 如果不存在連續一個大數據塊, 則會導入失敗。
導出 80M 以上的大表時, 記得 compress= N, 則不會引起這種錯誤。
   五、Imp Exp 使用的字符集不同
如果字符集不同, 導入會失敗, 可以改變 unix 環境變量或者 NT 註冊表裏 NLS_LANG
關信息。
   六、Imp Exp 版本不能往上兼容

Imp 可以成功導入低版本 Exp 生成的文件


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