oracle 學習

1、數據庫語言部分
1. SQL語言:關係數據庫的標準語言
2. PL/SQL:過程化語言Procedural Language
3. SQL*Plus:簡單的報表,操做系統接口html

4. Oracle 8.01後出現:
(1) 數據分區技術:只適用8.01後的版本,數據分散存放,不要放在一個硬盤上,I/O性能好,安全性能好。
(2) 對象技術:存儲過程、函數、包、數據庫觸發器、動態SQL編程
(3) 數據庫權限管理
(4) 數據完整性約束(Data Integrity Constraints)前端

2、Oracle 數據庫核心,數據庫管理員DBA
 數據庫的管理與平常維護
 數據庫整體設計
 數據庫存儲結構設計:物理結構、邏輯結構
 
/**************************************************************************************************java

能夠運行Oracle的操做系統:
UNIX:Sun Solaris, HP-UX, AIX, Compaq-Tru64, SCO-UNIX和Linux(運行在PC機上)node

Windows NT/2000web

P4機器上不能安裝Oracle,要想安裝須要對安裝文件進行修改或者下載補丁程序
在P4機器上安裝Oracle的方法(只限於Intel P4機器):
將Oracle的安裝光盤拷貝到硬盤上,而後將/stage/components/oracle.swp.jre/win32/bin/symcjit.dll 文件更名爲symcjit.org,而後再開始安裝。sql

***************************************************************************************************/shell

數據庫的備份與恢復
優化與性能調整數據庫

3、應用系統開發編程

4、應用服務器OASwindows

5、在Windows NT/2000下清除Oracle8i運行環境(從新安裝前的準備工做):

1. 刪除Oracle8i註冊表:
regedit.exe => HKLM => Software => ORACLE

2. 刪除Oracle8i服務:
regedit.exe => HKLM => System => CurrentControlset => Services => 以Oracle開頭的服務

3. 刪除Oracle8i事件日誌:
regedit.exe => HKLM => System => CurrentControlset => Services => Eventlog => Application => 以Oracle開始的事件

4. 刪除Windows NT/2000安裝磁盤/Program Files/Oracle目錄。

5. 刪除Oracle8i環境變量
控制面板 => 系統 => 高級 => 環境變量
(1) 刪除CLASSPATH
(2) 編輯PATH,將其中與Oracle有關係的路徑刪除。

6. 刪除Oracle8i菜單

7. 從新啓動Windows NT/2000,中止服務。

8. 刪除Oracle8i主目錄。

/*
IP: 75.64.16.X
Mask: 255.255.248.0
GateWay: 75.64.16.3
DNS: 75.64.16.3
*/

[7、Oracle 網絡配置]

/*
(1) 查詢數據庫名:
SQL> select name from v$database;

(2) 查詢數據庫實例名:
SQL> select instance_name from v$instance;

(3) 查詢數據庫服務名:
SQL> select value from v$parameter where name='service_names';  // (小寫)

(4)  查詢全局數據庫名(sys用戶):
SQL> select value$ from props$ where name='GLOBAL_DB_NAME';   // 字符串區分大小寫
*/

1.  Oracle網絡驅動使用SQL*Net v2.0 鏈接

Oracle for Win98 -> SQL*Net  Easy Configuration

2. Oracle 網絡驅動使用Net8 鏈接

3. Oracle 網絡驅動使用Net8i 鏈接

Oracle程序組-> Network Administration -> Net8 Assistant

[建立TNS鏈接過程]:
(1) 啓動Net8 Assistant
(2) 本地->服務命名
(3) 編輯->建立...
(4) 第一頁:網絡服務名:給要使用的網絡數據庫在本機指定一個Host String,本身定義。
(5) 第二頁:協議:TCP/IP(Internet協議)
(6) 第三頁:
  主機名:輸入對方機器的IP地址或域名。
  端口號:默認是1521,通常不須要修改。
(7) 第四頁:(Oracle8i)服務名:輸入網絡數據庫的服務名
(8) 第五頁:完成。
(9) 菜單:文件->保存網絡配置。

監視用戶會話:
SQL> select username, sid, serial#, machine from v$session;
刪除用戶會話:
SQL> alter system kill session 'sid,serail#';

/* 練習
sqlplus stud01/stud01
SQL> show user

SQL> select * from emp;

SQL> select * from dept;

*/
[ // 使用下面的方法能夠重複執行上一條SQL語句(在SQL*Plus中)
SQL> l  //小寫字母L,顯示上一條SQL語句
  1* select username, sid, serial#, machine from v$session
SQL> /  // 正斜槓:重複執行上一條SQL語句

SQL> set linesize 1000  //將SQL*Plus中顯示行寬設成1000個字符。

SQL> connect system/manager@orasjz   // 在SQL*Plus中直接鏈接到另外一臺機器上的數據庫,@字符後是另外一臺機器的tnsname

]

4. 手工配置Oracle網絡鏈接:主要是配置"tnsnames.ora"文件。
A. 手工配置Oracle網絡鏈接配置文件:tnsnames.ora

(1) 在UNIX中:/u01/app/oracle/product/8.1.6/network/admin/tnsnames.ora

(2) 在Windows 98/NT/2000中:d:/oracle/ora81/network/admin/tnsnames.ora

B. 手工配置Oracle監聽進程配置文件:listener.ora

(1) 在UNIX中:/u01/app/oracle/product/8.1.6/network/admin/listener.ora

UNIX下啓動進程命令:
$ lsnrctl start    // 啓動監聽進程
$ lsnrctl status  // 顯示監聽進程狀態
$ lsnrctl stop   // 中止監聽進程

(2) 在Windows 98/NT/2000中:d:/oracle/ora81/network/admin/listener.ora

啓動進程的命令與UNIX相同。


# LISTENER.ORA Network Configuration File: d:/Oracle/Ora81/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = ORA54)(PORT = 1521))
        //注意:上面一行的HOST必須是你的主機名,不然監聽會出問題,也能夠使用你的機器的IP地址
      )
    )
    (DESCRIPTION =
      (PROTOCOL_STACK =
        (PRESENTATION = GIOP)
        (SESSION = RAW)
      )
      (ADDRESS = (PROTOCOL = TCP)(HOST = ORA54)(PORT = 2481))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = d:/Oracle/Ora81)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ora54)
      (ORACLE_HOME = d:/Oracle/Ora81)
      (SID_NAME = ora54)   // 注意:ora54爲數據庫的SID名稱,不能更改,不然監聽出問題
    )
  )


5. 將主機字符串(Host String)寫入註冊表(簡化SQL*Plus的登陸)
regedit.exe -> HKLM -> Software -> Oracle -> home0
增長關鍵字: local(字符串),鍵值:主機字符串名。
/* 將下面的內容複製到一個.reg文件中,在Windows 2000中雙擊執行,便可實現增長或者修改local鍵值的做用
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0]
"local"="ora54"
*/

[SVRMGRL: Server Manager的使用方法]
D:/>svrmgrl

Oracle Server Manager Release 3.1.6.0.0 - Production

版權全部 (c) 1997,1999,Oracle Corporation。保留全部權利。

Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production

SVRMGR> connect internal  //使用svrmgrl,進入後使用的第一個命令必須是這個命令。
口令:   // 若是要求輸入口令,請輸入oracle
鏈接成功。
SVRMGR> select name from v$database;  // 檢查當前使用的數據庫名
NAME
---------
ORA44
已選擇 1 行。
SVRMGR> shutdown immediate  //關閉當前使用的數據庫
已關閉數據庫。
已卸下數據庫。
已關閉 ORACLE 實例。
SVRMGR> startup    //啓動當前使用的數據庫,若是無效,請使用startup force
已啓動 ORACLE 實例。
系統全局區域合計有                         24433932個字節
Fixed Size                                          70924個字節
Variable Size                                     7507968個字節
Database Buffers                                 16777216個字節
Redo Buffers                                        77824個字節
ORA-00205: ?????????????????????
SVRMGR>

[另外一個啓動oracle數據庫的例子]
d:/> sqlplus internal/oracle
SQL> startup force  //強行從新啓動數據庫。


[修改口令字]
SQL> grant connect to system identified by NewPassword;  //若是用數字做口令,須要使用雙引號括起來
SQL> grant connect to sys identified by NewPassword;
SQL> alter user system identified by NewPassword;
SQL> alter user sys identified by NewPassword;
SQL>password  //須要輸入原口令

// 注:以上修改口令的方法等價;sys與system用戶能夠互相修改口令;若是sys與system用戶的口令都忘記了,使用以下方法:

D:/>svrmgrl

Oracle Server Manager Release 3.1.6.0.0 - Production

版權全部 (c) 1997,1999,Oracle Corporation。保留全部權利。

Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production

SVRMGR> connect internal/oracle
鏈接成功。
SVRMGR> grant connect to system identified by manager;
語句已處理。
SVRMGR> exit
服務器管理程序結束。

[2002.04.18]
//=========================================================================================================

8、Oracle 產品組成

查詢數據庫選件產品:
SQL> select * from v$option;
通常都是True, 若是是False, 能夠雙擊激活。
/* cartridges (小產品的)插件,(大產品的)選件(options)*/

[SYS用戶是Oracle數據庫中權限最大的用戶。]

[SQL*Plus登陸方法]
1. c:/> sqlplus "/ as sysdba"
2. c:/> sqlplus internal
// 注意:以上兩種方法能夠相似的使用於SQL*Plus的圖形登陸界面中
// 用這種登陸方法登陸進去,所使用的用戶均爲SYS。
[之因此會出現這種登陸方法,是由於在NT的用戶組中存在一個ORA_DBA的本地組, 凡在此組中的用戶使用操做系統認證,即在此組中的用戶登陸數據庫時不須要密碼。]

[orapwd命令:修改internal用戶的口令字]
/* orapwd的命令行參數
D:/>orapwd
Usage: orapwd file=<fname> password=<password> entries=<users>

  where
    file - name of password file (mand),
    password - password for SYS and INTERNAL (mand),
    entries - maximum number of distinct DBA and OPERs (opt),
  There are no spaces around the equal-to (=) character.  */

修改internal口令字(internal默認口令爲oracle)認證方法(A B兩個步驟):

A. 修改Oracle登陸認證方法:
修改文件SQLNET.ORA文件。
SQLNET.AUTHENTICATION_SERVICES=(NTS) //將這一行前面加上#號註釋掉,便可將Oracle的認證方法由操做系統認證改成Oracle認證

SQLNET.ORA文件的位置:
UNIX:/u01/app/oracle/product/8.1.6/network/admin/sqlnet.ora
Windows NT/2000: d:/oracle/ora81/network/admin/sqlnet.ora

B. 修改Internal口令字:
Windows NT/2000:
C:/>ORAPWD file=d:/oracle/ora81/database/pwdora8i.ora
  password=YourPassword  // YourPassword爲你要設置的密碼
  entries=30
/* ORAPWD file=d:/oracle/ora81/database/pwdora54.ora password=qev entries=30 */

UNIX:
$ orapwd file=$ORACLE_HOME/dbs/orapwSID
  password=YourPassword
  entries=30
而後從新啓動Oracle服務(服務->OracleServiceHOSTNAME)。

/* 在執行上述命令以前,須要先將相應目錄的pwdora8i.ora(或orapwSID)文件刪除或者更名,由於口令字文件不能重名。*/

[tkprof 跟蹤文件整理工具]
$ tkprof x.trc x.txt

Windows 2000/NT:
d:/oracle/admin/db_name/udump/*.trc

UNIX:/u01/app/oracle/amdin/db_name/udump/*.trc     // */


9、Oracle數據分區技術:8.0之後開始使用

(一)LOB(Large Object)大對象類型數據:
1. BLOB:存儲二進制數據,如圖象、視頻、聲音等,用於代替Long raw類型(Oracle7.0之前的數據類型,從此再也不支持)
2. CLOB:存儲大字符,如:我的簡歷,用於代替long字段。
3. NCLOB:其它民族語言的支持
(1) 數據庫字符集NLS:
Server端:NLS_CHARACTERSET: (若是爲如下的字符集,Oracle的數據庫能夠用來存儲漢字)
 ZHS16GBK(Oraclei8, Oracle8)
 ZHS16CGB231280(Oracle7.3, 8, 8i)

此參數位置在數據字典中,查詢核心字符集(語言、日期、貨幣等):
SQL>select * from nls_database_parameters;

Client端:NLS_LANG=Simplified Chinese_CHINA.ZHS16GBK (若是沒有設置,默認是英文)
regedit.exe

UNIX Client中:
$ NLS_LANG="simplified chinese"_china.zhs16gbk
$ export NLS_LANG

//通常將上述環境變量放入.profile文件中。

/***********************************************插入內容********************************************************

(1) sys是一種用戶,internal是一種方式,用來啓動關閉數據庫,9.0之後再也不使用internal,所有是sys。

(2) SQL>set com v7  //將8i版本暫時退回到7版

(3) SQL> alter system suspend; // 使用internal用戶執行,凍結數據
    SQL> alter system resume;  // 取消凍結,恢復正常

****************************************************************************************************************/

(2)Oracle數據庫核心字符集修改方法:

[*] 修改數據字典(使用SYS用戶):
SQL>update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';
SQL>commit;
而後從新啓動數據庫。

4. BFILE:外部文件存儲,將數據存儲在服務器硬盤

10、Oracle 8i 數據庫改變:
1. 網絡計算數據庫
2. 支持IFS(Internet File System)
3. 集成Java虛擬機


[數據庫語言]
第一章  SQL語言基礎

1、什麼是SQL語言:
Structured Query Language ---- 結構化查詢語言

SQL*Plus支持的SQL語言:
1. SQL語言(標準的SQL語言)
2. SQL*Plus語言(非標準):報表或接口
3. PL/SQL 語言(非標準):程序開發(例如存儲過程)

2、SQL語言特色:
1. 非過程化語言
2. 功能強
3. 提供視圖功能
4. 兩種使用方式
(1)交互式
(2)程序式: SQL> @filename.sql

5. 提供數據控制

3、SQL語言分類:
1. 數據查詢語言(QL): Query Language
2. 數據操縱語言(DML): 包括數據的插入、更新和刪除,Data Manipulation Language
3. 數據定義語言(DDL Data Definition Language): 建表、建視圖、建存儲過程等
4. 數據控制語言(DCL Data Control Language): 事務控制、包括權限等

4、SQL關鍵字(命令)
SQL關鍵字(如下命令爲SQL命令,以分號結束)
1. Alter:修改表結構
2. Audit: 審計, NoAudit(取消審計)
3. Commit:數據提交,相反的命令:Rollback(回退)
4. Comment:將oracle的註釋寫入數據字典
5. Create: 建表、數組、索引、視圖等, 相反的命令:Drop
6. delete: 刪除表中的數據, Drop是把表中的數據包括結構所有刪除
7. Grant:受權, Revoke:收權(權限回收)
8. Insert:在表中插入新行
9. Lock: 將表強行鎖住
10. Rename:修改表名
11. Select: 數據查詢
12. Update:數據更新,修改某一個列
13. Validate:校驗,對數據進行校驗。

5、SQL命令的輸入:
在SQL>提示符後輸入命令,能夠輸入多行,以分號結束

6、SQL*Plus 關鍵字:以回車結束
1. @: 執行外部命令,格式:@路徑/文件名
2. #: 註釋
3. /: 執行上一條命令
4. Accept:接收鍵盤輸入的命令
5. Append(簡化爲a): 在行尾增長字符串
/* 例
SQL> select * from dep;
select * from dep
              *
ERROR 位於第 1 行:
ORA-00942: 表或視圖不存在


SQL> a t
  1* select * from dept
SQL> /

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 COMPUTER       BEIJING
*/

6. Break: 分組, Syntax: break on 分組列 skip n //n爲每兩組之間間隔的空行
/* 例:
SQL> break on job
SQL> select * from emp order by job;  // 此處務必按分組列排序

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 13-6月 -87       3000                    20
      7902 FORD                       7566 03-12月-81       3000                    20
      7369 SMITH      CLERK           7902 17-12月-80        800                    20
      7876 ADAMS                      7788 13-6月 -87       1100                    20
      7934 MILLER                     7782 23-1月 -82       1300                    10
      7900 JAMES                      7698 03-12月-81        950                    30
      7566 JONES      MANAGER         7839 02-4月 -81       2975                    20
      7782 CLARK                      7839 09-6月 -81       2450                    10
      7698 BLAKE                      7839 01-5月 -81       2850                    30
      7839 KING       PRESIDENT            17-11月-81       5000                    10
      7499 ALLEN      SALESMAN        7698 20-2月 -81       1600        300         30

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7654 MARTIN     SALESMAN        7698 28-9月 -81       1250       1400         30
      7844 TURNER                     7698 08-9月 -81       1500          0         30
      7521 WARD                       7698 22-2月 -81       1250        500         30

已選擇14行。

SQL> break on job skip 1
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 13-6月 -87       3000                    20
      7902 FORD                       7566 03-12月-81       3000                    20

      7369 SMITH      CLERK           7902 17-12月-80        800                    20
      7876 ADAMS                      7788 13-6月 -87       1100                    20
      7934 MILLER                     7782 23-1月 -82       1300                    10
      7900 JAMES                      7698 03-12月-81        950                    30

      7566 JONES      MANAGER         7839 02-4月 -81       2975                    20
      7782 CLARK                      7839 09-6月 -81       2450                    10
      7698 BLAKE                      7839 01-5月 -81       2850                    30

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------

      7839 KING       PRESIDENT            17-11月-81       5000                    10

      7499 ALLEN      SALESMAN        7698 20-2月 -81       1600        300         30
      7654 MARTIN                     7698 28-9月 -81       1250       1400         30
      7844 TURNER                     7698 08-9月 -81       1500          0         30
      7521 WARD                       7698 22-2月 -81       1250        500         30


已選擇14行。
*/
7. Btitle, Ttitle:設置表尾、表頭
SQL> Ttitle '表頭'
SQL> Btitle '表尾'
SQL> Ttitle off //失效

8. Change: 寫錯了改正, Syntax: C/old/new
/* 例:
SQL> select * from detp;
select * from detp
              *
ERROR 位於第 1 行:
ORA-00942: 表或視圖不存在


SQL> c/tp/pt
  1* select * from dept
SQL> /

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 COMPUTER       BEIJING
*/

9. Clear: 清除
SQL> clear break   // 清除前面的break設置
SQL> clear buff  // 清除SQL*Plus緩衝區中的SQL語句

10. Column: 列定義,用於定義列的顯示格式
語法:SQL> column 列名 format 格式
例:SQL> Column sal format $99.999999

11. computer: 統計計算

12. connect: 從一個用戶退出,直接進入另外一個用戶

13. disconnect: 中斷當前用戶的鏈接

14. copy: 遠程複製(用的較少,通常數據鏈路)

15. define:定義

16. undefine:取消定義

17. del: 刪除當前行

18. describe(簡寫desc): 顯示錶結構
例:SQL> desc emp

19. document: 文檔註釋

20. edit(簡化ed):調入外部編輯器編輯緩衝區中的SQL語句,保存後,能夠直接經過「/」運行編輯過的SQL語句

21. get: 將外部文件調入不執行,只供顯示
例:SQL> get c:/sqlplus.ora

22. host: 執行操做系統命令
例:SQL> host dir

23. input(簡化爲I): 行插入,在當前行的後面插入。

24. List(簡化爲L): 列示

25. Pause: 設置屏幕暫停
SQL> set pause on   //暫停
SQL> set pause off   //不暫停
SQL> set  'more' pause on [???]

26. Quit: 退出

27. Remark: 註釋

28. Run(R): 相似「/」

29. Save: 將已經運行過的SQL命令保存到磁盤
例:SQL> save c:/run.sql  replace  //覆蓋保存
      append  //追加

30. set: 設置

31. show: 顯示環境變量的值

32. Spool: 顯示跟蹤
例:SQL> spool c:/文件名
SQL> spool off  //中止記錄

33. Start: 相似@,執行外部的SQL文件

33. Timing: 服務器端某一命令的執行時間跟蹤

7、數據字典:描述系統信息的表、視圖、同義詞等,由系統自動維護。
例:SQL>select * from tabs;

1. 顯示當前所登陸的用戶:select * from all_users;

2. user_xxx:描述用戶建立的對象,如:user_tables,user_views,user_indexes

3. dba_XXX:數據庫管理員(sys, system)專用數據字典

4. all_XXX: 描述用戶建立的對象,其餘用戶受權能夠存取的對象。
all_objects: 所有的數據字典


[第二章 數據庫查詢語言(QL)]

1、查詢語句基本語法:
1. 查詢全表的數據:
SQL> select * from emp;

2. 查詢某(幾)個列:SQL> select ename, sal from emp;

3. DISTINCT 標識:只顯示不相同的列
例:
SQL> select job from emp;  // 顯示結果中有相同的記錄
SQL> select distinct job from emp; // 只顯示不相同的職業

4. 使用order by將顯示結果排序:ASC升序(默認),DESC降序

5. 使用where指出查詢條件:
SQL> select * from emp where sal > 2000;

[字符型或日期型用單引號括起來,並區分大小寫]


6. 設置日期顯示格式:
(1) 肯定日曆格式:設置參數nls_calendar。

SQL>alter session set nls_calendar='Japanese Imperial'; //設置爲日本日曆
SQL>alter session set nls_calendar='ROC official';  //設置爲臺灣日歷
SQL>alter session set nls_calendar='Gregorian';   //設置爲格林尼治日曆,這是咱們要設置成的日曆。

SQL> select sysdate from dual;  //查詢系統時間

(2) 肯定日期格式:參數nls_date_format
經常使用的日期格式:
yyyy.mm.dd 
yyyy-mm-dd
yyyy/mm/dd 
yyyy"年"mm"月"dd"日"   //若是要顯示漢字,請用雙引號括起來
yyyy"年"mm"月"dd"日"dy  // dy表示星期

命令格式:
SQL>alter session set nls_date_format='格式';
[此命令只修改前端的顯示,退出後即失效,要想永久有效,要修改註冊表,在註冊表中HKLM->Software->Oracle->Home0增長字符串關鍵字nls_date_format,鍵值爲日期格式,此處的格式不須要用單引號括起來。]

例:SQL>alter session set nls_date_format='yyyy"年"mm"月"dd"日"dy';

7. Oracle登陸自動執行文件glogin.sql:每次用戶登陸時自動執行該文件,能夠將一些環境變量(如linesize)的設置命令或者其它命令放入該文件中。

glogin.sql文件路徑:

Windows下:d:/oracle/ora81/sqlplus/admin/glogin.sql

UNIX: /u01/app/oracle/product/8.1.6/sqlplus/admin/glogin.sql


2、運算符與謂詞
一、算術運算符:+, -, *, /

SQL> select sal, sal*12 from emp;   //計算工資及年薪。
SQL> select sal, sal+comm from emp;   //錯誤語句,由於comm中存在空值,會使運算結果也會出現空值。
SQL> select sal, sal + NVL(comm,0) from emp; // 正確語句,NVL爲空值運算函數,當comm爲空值時,該函數返回第二個值0。

二、邏輯運算符:NOT, AND, OR,三個運算符的優先級別依次下降。

三、比較運算符:>,  <,  =,  >=,  <=,  !=

四、謂詞:
(1) IN(或NOT IN):等於(不等於)列表中的任意值。

SQL> select * from emp where job in ('MANAGER', 'CLERK')

(2) (NOT) BETWEEN AND : 表示從小到大的一個範圍。[必須是從小到大]
SQL> select * from emp where sal not between 2000 and 3000;

(3) LIKE:模式匹配
SQL> select * from emp where ename like 'S%';   //尋找ename爲S打頭的記錄
%: 表示任意字符串
_(下劃線): 表示一個任意字符

SQL> select * from emp where ename like '李%';   //能夠使用中文
SQL> select * from emp where ename like 'S_I%';   //尋找ename爲S打頭,第三個字母爲I的記錄
SQL> select object_name from all_objects where object_name like 'DBA%'; //搜索數據字典中與dba有關係的對象

(4) <IS> (NOT) NULL(空值):

SQL> select * from emp where comm is NULL;  //查詢哪些人沒有資金。

5. 僞列:

(1) rowid: 惟一行標識,行被刪除以後,rowid不變。
(2) rownum: 行號,一行被刪除以後,後面的行號會隨之改變

SQL> select empno, ename, rowid, rownum from emp;


[查詢SQL語句的相關數據字典]

(1)SQL> select sql_text from v$sqlarea;  //查詢之前使用過的SQL語句

(2)查詢當前鏈接用戶的SQL語句:
SQL> select user_name,sql_text from v$open_cursor; //須要用sys或system用戶執行

3、列名別名
SQL> select ename, sal as Salary from emp;
SQL> select ename  職工姓名, sal 工資 from emp;

* # / / select 都不容許作別名,若是必定要用,用雙引號括起來。


[第三章 數據操縱語言(DML)]

1、數據插入:

1. 對於表中所有列插入
語法:SQL> insert into 表名 values(值表達式);

例:SQL> Insert into dept values(51, '軟件開發部', '北京');

[*] 用desc顯示錶結構、數據類型、順序   SQL> desc dept    //注意,不要將linesize設置的太大,不然看不到表結構,設置成100便可。
[*] 所插數據必須與目標列一致。
[*] 字符與日期數據使用單引號


2. 對於表中部分列插入
語法:SQL> insert into 表名(列名1,列名2...)  values(值表達式);
[*]對於表中的非空列必須插入數據

SQL> insert into emp(empno, ename, job, hiredate,deptno) values(1234, '李大力', '工程師', sysdate - 30, 10);

/* sys 或 system 用戶訪問其它用戶的表的方法

SQL> connect system/ab@ora44
已鏈接。
SQL> select * from user01.emp      */

/******************** commit 及 Rollback用法:下例是Rollback的一個例子。
SQL> delete dept where deptno = 51;

已刪除 1 行。

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 COMPUTER       BEIJING

SQL> rollback;

重算已完成。

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 COMPUTER       BEIJING
        51 軟件開發部     北京

已選擇6行。
*************************************************/

3. 使用參數(變量),臨時輸入值

SQL> insert into 表名(列名1,列名2, ...) values(&x1, &x2, ...);

SQL> insert dept(deptno, dname, loc) values(&x1, '&x2', '&x3')

/* 例:
SQL> insert into dept values(&x1, &x2, &x3)   //&x2, &x3沒有用單引號括起來
輸入 x1 的值:  52
輸入 x2 的值:  'bb'        // 字符型數據輸入時須要輸入單引號
輸入 x3 的值:  'cc'        // 同上
原值    1: insert into dept values(&x1, &x2, &x3)
新值    1: insert into dept values(52, 'bb', 'cc')

已建立 1 行。

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 COMPUTER       BEIJING
        51 軟件開發部     北京
        52 bb             cc

已選擇7行。

SQL> insert into dept values(&x1, '&x2', '&x3');  // 在命令行中給字符或日期型參數加上單引號,則下面輸入時再也不須要輸入單引號

輸入 x1 的值:  53
輸入 x2 的值:  dd
輸入 x3 的值:  ee
原值    1: insert into dept values(&x1, '&x2', '&x3')
新值    1: insert into dept values(53, 'dd', 'ee')

已建立 1 行。
********************************************************************/

// define x = 7788      
// 也能夠這樣用:select &x1, &x2 from emp;

4. 使用子查詢從另外一個表中複製數據
語法:Insert into 表名 select 子句;

SQL> insert to emp(empno, hiredate, deptno)
  select deptno+7300, sysdate, deptno from dept;

SQL> insert to emp(empno, hiredate, deptno)
  select deptno+7300, sysdate, deptno from dept@數據庫鏈路名;    //表示dept這個表在網絡上的其它服務器中,注意:@以後不是鏈接串。

SQL> create table pay as select ename, sal from emp; // 用複製的方法建立表
SQL> insert into pay select * from pay;    //本身複製本身,能夠使一個表飛速擴大。


2、數據更新
語法:SQL> Update 表名 set 列名=值表達式  where 條件;

例:
SQL> update emp set sal = sal + 100 where sal < 2000;
SQL>update emp set sal = 5000, job='MANAGER' where ename = 'SMITH';
SQL> update emp set comm = 100 where comm is null;

3、數據刪除
語法: SQL> Delete from 表名 where 條件;       //刪除數據保留結構,能夠回退
  SQL>Truncate table 表名;    //刪除數據保留結構,不能夠回退,效率高
  SQL>Drop table 表名;     //刪除數據及結構,不能夠回退
 
[第四章 數據控制語言(DCL)]

1、事務提交:對於數據的插入、更新、刪除,只有提交後,數據才真正改變,在提交以前,只有修改了數據的用戶才能夠看到數據的改變,而其餘用戶看不到數據的改變。

1. 顯式數據提交語法:SQL> commit;

/* 某一個用戶對錶進行更新等寫操做以後,若是沒有commit,那麼其它用戶不能對錶進行更新操做,不然就會死掉。
查鎖方法:
SQL> select username, sid, serial# from v$session;

解鎖方法:
SQL> alter system kill session 'sid, serial#';

*****************************************************************************************************/

2. 隱式數據提交:
下列命令是隱式提交命令:
Create, Alter, Drop, Connect, Disconnect, Grant, Revoke, Rename, Exit, Quit, Audit, NoAudit

3. 自動數據提交:
SQL> set autocommit on   //打開自動數據提交開關
SQL> set autocommit off   //關閉自動數據提交開關(默認)

2、事務回退
語法:SQL>Rollback;  //使數據庫回退到最近一次提交後狀態,若是一次也沒有提交過,回到最原始狀態
SQL>Rollbac;
SQL>Rollba;
SQL>Rollb;
SQL>Roll;
//以上的用法都是正確的。


3、設置保存點:
SQL> SavePoint a;

回退到保存點:
SQL> Rollback to a;   //此處的Rollback不能再簡寫。


[第五章 數據定義語言(DDL)]

包括:建立基表、視圖、同義詞、索引、數據庫鏈路、序列等

1、建立基表
語法:
SQL> Create Table 表名(
 列名1 數據類型,
 列名2 數據類型,
 ...);    //最多能夠到1000個字段

例:SQL> Create Table product(
  p_name, varchar2(20),
  p_id_number number(7),
  p_date date);
 

1. 數據類型
(1)字符型
char(n): n<=2000,固定長度,若是實際長度不夠,前面用空格補齊。
varchar2(n): n<=4000,可變長度,不用空格補齊。
(2) 數字型 number(n):整數, number(n,d):小數
(3) 日期型
(4) 二進制raw(8i之前的,如今不支持了)
(5) 大字符long:建議不要使用,如今不支持了
(6) blob:存儲二進制
(7) CLOB:存儲大字符

SQL> Create table employee(
 name varchar2(30),
 salary number(7,2),
 b_date date,
 phote blob,
 resume clob);
 
[*]修改數據庫兼容性參數(若是在執行上面的SQL語句時,提示clob字段「默認字符集具備不一樣的寬度」,則須要修改數據庫兼容性。):
D:/oracle/amdin/db_name/pfile/init.ora
compatible=8.0.5 =改成=> 8.1.0或8.1.5
改完後從新啓動數據庫使修改生效。
/**********************************************
修改前:
SQL> Create table employee(
  2   name varchar2(30),
  3   salary number(7,2),
  4   b_date date,
  5   phote blob,
  6   resume clob);
 resume clob)
 *
ERROR 位於第 6 行:
ORA-22866: 默認字符集具備不一樣的寬度

修改後:
SQL> Create table employee(
  2   name varchar2(30),
  3   salary number(7,2),
  4   b_date date,
  5   phote blob,
  6   resume clob);

表已建立。

************************************************/

2. 約束條件:數據完整性約束條件(Data Integrity Constaints)

Oracle 經常使用約束條件:
(1) 非空約束:NOT NULL
(2) 惟一性約束:UNIQUE
(3) 主鍵:PRIMARY KEY,主鍵同時具備上面兩個約束條件,一個表中只容許有一個主鍵。
(4) 外鍵:FOREIGN KEY,這一列值從其它表中取出,容許重複,但不容許修改。
(5) 檢查:CHECK  (e.g. check (sal > 200)
(6) 引用(參考):REFERENCES,只能用其它表或者本表的某一列列值,不能隨便修改。
(7) 缺省值:DEFAULT,若是沒有輸入,自動使用DEFAULT值。

3. 約束條件的定義方法:
能夠定義爲列的一部分,也能夠定義爲表的一部分。
(1)定義爲列的一部分:
SQL> Create Table product(
 p_name varchar2(20) unique,
 p_id number(7) primary key,
 p_date date not null);

[*] Check、Default約束條件:
SQL> Create table employee(
 name varchar2(20),
 id number(7) primary key,
 sal number(11) check(sal > 200 and sal < 2000),
 h_date date default sysdate);

一個列具備多個約束條件的寫法:
SQL> Create Table product(
 p_name varchar2(20) unique,
 p_id number(7) primary key,
  check(p_id >= 111 and p_id <= 999),
 p_date date not null);

例:
SQL> insert into employee(name, id, sal) values('Smith', 2, 201);
SQL> select * from employee;

NAME                         ID        SAL H_DATE
-------------------- ---------- ---------- --------------
ChenZheng                     1        500 2002年04月14日
Smith                         2        201 2002年04月19日


(2)定義爲表的一部分(不能用在Default 和 Not NUll的定義上):
SQL> Create Table  Product(
 p_name varchar2(20),
 p_id number(7),
 p_date date not null,
 constraint p_id_pk primary key(p_id),
 constraint p_name_uk unique(p_name));
 
[*] 查詢約束條件:
SQL> select * from user_constraints where table_name = 'PRODUCT';

(3) 另外一種約束定義方法:
SQL> Create Table  Product(
 p_name varchar2(20),
 p_id number(7) constraint pk_p_id primary key,
 p_date date constraint fk_p_date not null);
 
4. 使用外鍵建立主從基表
(1) 建立主表(定義主表):
SQL> Create Table product(
 p_name varchar2(20),
 p_id number(7) primary key,
 p_date date not null);
 
(2)建立子表,定義外鍵
SQL> create table sales_list(
 sales_name varchar2(20),
 sales_id number(7) primary key,
 p_id number(7),
 constraint p_id_fk foreign key (p_id) references product(p_id));
 
5. 數據完整性約束條件的修改
(1) 刪除約束條件:
A. 刪除主鍵約束:
SQL> Alter table product drop primary key;
SQL> Alter table product drop constraint p_id_pk;

// 以上兩種方法等價

B. 刪除惟一性約束:
SQL> Alter table product drop unique(p_name);
SQL> Alter table product drop constraint p_id_uk;

C. 刪除非空約束
SQL> Alter table product modify(p_date NULL);

D. 刪除缺省值:
SQL> Alter table product modify(p_date default null);

(2) 增長約束條件
A. 增長主鍵約束:
SQL> Alter table product add primary key(p_id);
SQL> Alter table product add constraint p_id_pk primary key (p_id);

B. 增長非空約束
SQL> alter table product modify ( p_date not null);

C. 增長缺省值
SQL> Alter table product modify (p_date default sysdate-1);

[*]查詢缺省值:
SQL> select table_name, column_name, data_default from user_tab_columns;

2、修改表結構
1. 在表中增長新列:
SQL> Alter table product add (p_list number(7), p_loc varchar2(20));

2. 刪除一個列(只適用於Oracle8i之後的版本):

SQL> Alter table product drop(p_list, p_loc);  //刪除多個列
SQL> Alter table product drop column p_list;   //刪除一個列

3. 修改列寬:
SQL> Alter table product modify (p_name varchar2(40));
//增長列寬沒有約束,但減少列寬要求列中數據爲空。使用此命令也能夠修改列的數據類型。

3、視圖(View):視圖是虛表。
[*]視圖不存儲數據
[*]數據來源於基表
[*]不是數據的複製
[*]在同一個表上能夠建立多個視圖

1. 建立視圖的語法:
SQL> Create or Replace view 視圖名
 as select 語句;
 
例:SQL> create view manager
  as
  select * from emp where job='MANAGER';  // select * from tab; 檢查
 
 SQL> select * from manager;  // 查詢視圖若是查詢表
 
// 第二次建立視圖,能夠使用or replace參數,不須要再刪除而直接覆蓋同名視圖。
 SQL> create or replace view manager
    as
    select * from emp where job='MANAGER';
   
[幾點說明:]
(1) 在建立視圖時,不得使用order by排序。
(2) 在視圖中插入數據,則數據被插入到基表中,因此,若是要向視圖插入數據,則建立視圖時,必須包含表中所有非空列。
(3) 用戶視圖數據字典:
SQL> select view_name,text from user_views;

2. 視圖列別名:

錯誤語句:
SQL> create view payment as
 select sal, sal*12, nul(comm,0)/sal from emp;  // 錯誤緣由:視圖能夠視同爲表,因此列名也要符合規定,而sal*12則是不符合規矩的列名。

正確語句:
SQL> create view payment(c1, c2, c3) as  // c1, c2, c3即爲視圖列別名
 select sal, sal*12, nvl(comm,0)/sal from emp;

3. 建立視圖時增長約束條件:WITH CHECK OPTION

SQL> Create or replace view deptno20 as
 select empno, ename, deptno from emp where deptno=20;

SQL> Insert into deptno20 values(1236, '李力', 30);

SQL> select * from deptno20;

// 上面的語句會出現可以經過視圖入基表中插入數據,但卻不能經過視圖看到插入的數據的問題,解決辦法:
SQL> Create or replace view deptno20 as
 select empno, ename, deptno from emp where deptno=20
 WITH CHECK OPTION;

4. 建立Oracle8i的實體化視圖(Materialized View):視圖不依賴於基表,基表被刪除後,視圖仍然正常。通常用於兩個遠程數據庫之間的訪問,經過數據鏈路來實現。

(1) 以DBA用戶登陸,爲用戶授予建立實體化視圖的權限:
SQL> Grant Create Materialized View to 用戶名;

(2)以獲權用戶登陸,建立實體化視圖:
SQL> Create Materialized View manager as
 select * from emp where job = 'MANAGER';
 
(3) 刪除實體化視圖:
SQL> Drop Materialized View manager;

刪除基表:
SQL>drop table 表名;

刪除視圖:
SQL> drop view 視圖名;


3、建立數據庫鏈路(Database link):
數據庫鏈路:用於數據庫之間的遠程數據複製。

DB1(UNIX) <------- DB2(NT)

若要將DB2中的數據複製到DB1,則須要在DB1中建立數據庫鏈路指向DB2數據庫。

建立數據庫鏈路的步驟:
(1) 建立好鏈接串。
(2) 建立數據庫鏈路。

1. 建立數據庫鏈路的語法:
SQL> Create database link 數據庫鏈路名
 connect to 用戶名 identified by 口令
 using '主機字符串';

[*]數據庫鏈路名必須與遠程數據庫的全局數據庫名(數據庫名.域名,若沒有數據庫名,就是數據庫名)相同
[*]用戶名及口令爲遠程數據庫的用戶名及口令
[*]主機字符串爲本機tnsnames.ora中網絡鏈接串。

SQL> Create database link ora31 connect to user30 identified by user30 using 'ora31';

2. 使用數據庫鏈路:
SQL> select * from product@ora31;
SQL> insert into product@ora31 values(...);
SQL> Create table product as select * from product@ora31;

3. 刪除數據庫鏈路:
SQL> Drop database link ora31;

(一) 建立數據庫觸發器實現兩個數據庫之間實時數據傳輸。
DB1(UNIX) <------- DB2(NT)
若要將DB2中的數據複製到DB1,則須要在DB1中建立數據庫鏈路指向DB2數據庫。

[*]在對方的數據庫(DB2)上創建觸發器,即數據發送方的數據庫上創建觸發器。
[*]在數據發送方創建指向DB1的數據庫鏈路。

[操做步驟(假設db1爲ora31, db2爲ora8i):]
(1) 在DB1上創建用來複制遠程數據的表:
SQL> Create table product
 as select * from product@ora31;

(2) 在DB2上創建到DB1的數據庫鏈路:
SQL> Create database link ora31 connect to user30 identified by user30 using 'ora31';

(3) 在DB2上創建觸發器:
SQL> Create or Replace trigger insert_product before insert on product
 for each row
 Begin
  Insert into product@ora8i
  values(:new.p_id, :new.p_name);
 End insert_product;

// 上述建立數據庫觸發器的語句,請以.號結束,而後以/執行。

/* 查看SQL語句執行的錯誤信息:
SQL> show errors
*/

(4) 在DB2上測試數據的自動複製是否成功:
SQL> Insert into product values(1005, '測試商品');  // 在db2的表中插入一條數據
SQL> select * from product;       // 檢查數據是否正確插入本地表
SQL> select * from product@ora31;      // 檢查數據是否複製到了db1的表中

查詢數據庫鏈路信息:
SQL> select username, password from user_db_links;


數據更新:
SQL> Create or Replace trigger update_product
 before update on product
 for each row
 Begin
  update product@ora8i
  set p_id = :new.p_id, p_name = new.p_name where p_id = :old.p_id
 End update_product;

數據刪除:
SQL> Create or Replace trigger delete_product
 before delete on product
 for each row
 Begin
  delete from product@ora8i where p_id = :old.pid
 End delete_product


(二). 建立快照(實體化視圖)實現兩個數據庫之間定時數據庫傳輸:
快照:要求主副站點數據庫的用戶名相同

(1) 在主節點建立快照日誌
語法:SQL> Create snapshot log on 主節點表名;   //主節點基表必須含有主鍵

(2) 在副節點建立快照
語法:
SQL> Create snapshot 快照名
 refresh 刷新方式
 next 時間間隔
 with primary key
 for update
 as select * from 主節點表名@數據庫鏈路名;
 
[*]刷新方式:
Compelete:徹底刷新
Force:強制刷新(建議使用,強制刷新自動先fast刷新,而後再force刷新)
Fast:快速刷新
[*] 時間間隔:以天爲單位。
sysdate + 1/4  // 六個小時刷新一次
sysdate + 1/1440 // 一分鐘刷新一次

/******************************* 教師的部分操做語句 *****************************************************

如下SQL語句爲在副節點上的操做語句,主節點對應的用戶爲user30,例中的photo爲要建立快照的表名
create user user30 identified by user30;

grant connect, resource to user30;

grant create snapshot to user30;

connect user30/user30

create database link ora31 connect to user30 identified user30 using 'ora31';

select * from photo@ora31;

create snapshot photo
 refresh force
 next sysdate + 1/1440
 with primary key
 for update
 as select * from photo@ora31;

********************************************************************************************************/
 
/************************** 個人操做步驟 ******************************
[1] 主節點:ora8i
SQL> show user
USER 爲"STUD29"
SQL> create snapshot log on dept;

實體化視圖日誌已建立。

SQL> show user
USER 爲"STUD29"
SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 COMPUTER       BEIJING

SQL> insert into dept values(60, 'test snap', 'snapshot');

已建立 1 行。

提交完成。

[2]副節點

SQL> connect system/ab
已鏈接。
SQL> create user stud29 identified by stud29;

用戶已建立

SQL> grant connect, resource to stud29;

受權成功。

SQL> grant create snapshot to stud29;

受權成功。

SQL> connect stud29/stud29;
已鏈接。
SQL> connect system/ab
已鏈接。
SQL> grant create database link to stud29;

受權成功。

SQL> connect stud29/stud29
已鏈接。
SQL> create database link ora8i connect to stud29 identified by stud29 using 'tea';

數據庫連接已建立。

SQL> create snapshot dept
  2  refresh force
  3  next sysdate+1/2880
  4  with primary key
  5  for update
  6  as select * from dept@ora8i;

實體化視圖已建立。
*******************************************************************************************/


[Oracle8i 圖形界面管理工具]

Oracle 程序組->Enterprise Manager->

(1)先運行該組中的Configuration Assistant,建立一個新的檔案資料庫(其做用請查詢相應界面上的幫助信息)。

(2) 而後運行該組中的Console程序:
登陸用戶:sysman 密碼:oem_temp

而後搜索要管理的節點(使用主機名或者IP地址均可以),節點要想被搜索到,須要先在節點上啓動OracleOraHome81Agent服務,要想在節點上使用圖形管理工具,要求先啓動OracleOraHome81ManagementServer服務。


4、建立索引(indexes):

語法:SQL> create index 索引名 on 表名(列名);

例:SQL> create index index_dept_dname on dept(dname);

索引數據字典:
SQL>select index_name, table_owner, table_name, from user_indexes;

5、建立序列(Sequences):

語法:SQL> Create sequence 序列名
  start with 起始編碼
  increment by 步長
  maxvalue 終止編碼;

SQL> create sequence id_code
 start with 2
 increment by 2
 maxvalue 999;
 
序列使用方法:
id_code.nextval  // 下一個值
id_code.currval  // 當前值

第一次要使用nextval,而後之後每次使用currval。

insert into student values(id_code.nextval, '姓名');


[*] ||(雙豎線)在oracle中是鏈接符號,將兩個字符串連成一個,如:'A' || 'B' = 'AB'


[第六章 數據庫分區技術]

1、什麼是數據分區?
  數據分區是指把一個表劃分紅若干小塊。在建立表的結構時應考慮好分區方案,選擇表中某一列或多列數據做爲分區關鍵字,該關鍵字決定哪些數據分到哪些區。Oracle對分區進行管理,新插入數據自動存儲到相應的分區。

2、建立分區表:

SQL> Create table employee (
 id number(7),
 name varchar2(20),
 sal number(7,2))
 Partition by range(sal)
 (Partition p1 values less than(500) tablespace users,
 Partition p2 values less than(800) tablespace tools,
 partition p3 values less than(1000) tablespace system);

// p1, p2, p3是三個分區的名字,users, tools, system是三個表空間的名字。less than是小於(不包含)。
幾點說明:
[.] 所插數據不得大於LESS THAN中的最大值
[.] 能夠使用MAXVALUE(如上面的語句中,要求工資不能大於1000,若是出現這種狀況,則應該改爲下面的語句:
SQL> Create table employee (
 id number(7),
 name varchar2(20),
 sal number(7,2))
 Partition by range(sal)
 (Partition p1 values less than(500) tablespace users,
 Partition p2 values less than(800) tablespace tools,
 partition p3 values less than(1000) tablespace system,
 partition p4 values less then(maxvale) tablespace users);
 
[.] 不指定表空間時,則該區使用該用戶的缺省表空間。
* 查詢每一個用戶的用戶缺省表空間:
SQL> select username, default_tablespace from dba_users; // 使用dba用戶查詢

[*]查詢能夠使用的表空間名字:
SQL> select tablespace_name, file_name from dba_data_files; // 使用dba(sys或system)來執行

SQL> select dba_users.username, dba_users.default_tablespace, dba_data_files.file_name
 from dba_users, dba_data_files
  where dba_users.default_tablespace = dba_data_files.tablespace_name;

[temp表空間不能用於數據分區。]

3、分區表的查詢方法:
SQL> select * from employee;   // 按沒有分區的方法查詢

SQL> select * from employee partition(p1);   // 只查詢p1分區的數據。
SQL> create table part3 as select * from employee partition(p3);

4、分區表的修改:
一、增長分區:
SQL> Alter table employee ADD
 partition p4 values less than(1500) tablespace users;

[*]分區數據字典:
SQL> select partition_name, high_value, tablespace_name
 from user_tab_partitions
 where table_name = 'EMPLOYEE';
 
二、刪除分區:
SQL> Alter table employee DROP partition p4;   // 結構數據所有刪除(相應分區及數據所有被刪除)
SQL> Alter table employee TRUNCATE partition p4;  // 保留結構(即區還存在),數據刪除

三、修改區名:
SQL> Alter table employee RENAME partition p4 to p5;

四、分區數據移動:將分區數據從一個表空間移動到另外一個表空間
SQL>Alter table employee MOVE partition p4 tablespace system;

五、分區的拆分:

SQL> Alter table employee SPLIT
 partition p3 at(900)
 into(partition p31, partition p32);
 
/* 關於數據字典的幾點說明:
v$打頭的數據字典,後面不會以s結尾,例如:V$database, v$session;
user打頭的,後面都會以s結尾(複數), 如:user_tab_partitions, user_tables
dba打頭的,有的以s結尾,有的不。
***************************************************************************/

六、分區的合併:
SQL> Alter table employee MERGE partitions p31, p32 into partition p3;


[第七章 SQL*Plus 報表功能]

/**********************  插入內容:數據字典的一些說明 *****************************
(1) user_XXX:用戶,例如:user_tables
(2) dba_XXX: DBA專用
(3) all_XXX: 本用戶建的,或者其它用戶建立本用戶能夠查詢的(須要其它用戶的受權)
(4) v$XXX: 動態數據字典,如:v$database, v$instance, v$session,這些數據字典在oracle不啓動時也能查詢
***********************************************************************************/
1、定義表頭與表尾
SQL> ttitle '表頭'

SQL> btitile '表尾'

失效:SQL> ttitle off
 SQL> btittle off

2、定義列名
語法:SQL> column 列名 heading 別名   // 別名不區分大小寫

3、定義列格式:
SQL> column 列名 Format 格式
經常使用列格式:An :  A爲字符,n爲最大字符寬度。

$99.9999.99
9.99eeee

例:SQL> Column sal format $99.9999.99
SQL> Column comm like Sal

4、分組命令:
語法:SQL> break on 列名 skip n
例:SQL> break on deptno skip 2
SQL> select * from emp order by deptno;

5、統計計算:
語法:SQL> compute 函數 of 統計列 on skip n  //能夠使用的函數有:sum, max, min, avg,count, var(斜方差), std(標準差)
例:SQL> compute sum of sal on deptno
清除命令:SQL> clear compute
  SQL> clear break
  SQL> clear column


增長報表級統計:
SQL> break on deptno on REPORT
SQL> compute sum of sal on report
// 整個報表出一個結果,上面兩行都要運行,那麼整個報表會根據你的設置出一個sum of sal的總計結果。


[第八章 函數]

1、日期格式轉換函數:to_char(日期變量,'格式')  // 格式要用單引號括起來

(1) 日期格式構成方法:

  年   月   日   時    分  秒
  yy    mm   dd   hh(12小時制)  mi  ss
  yyyy   mon   dy(星期)  hh24(24小時制)
     month  day  
 
A. yy.mm.dd, yy/mm/dd, yy-mm-dd, yyyy.mm.dd, ... 加中文也能夠,中文要用又引號括起來

SQL>select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;  // dual是一個虛擬表,任何用戶均可以使用。

2、聚組函數:從一組中返回彙總信息
聚組函數有:Sum, count, count distinct, max, min, avg, stddev(標準差)

例:SQL>select min(sal), max(sal), avg(sal), sum(sal) form emp;
SQL> select ename, job, sal from emp where sal=(slect max(sal) from emp);
SQL> select count(*) from emp;
.....[請參考PowerPiont教程:SQL講稿.ppt]


[第九章 複雜查詢]


1、鏈接查詢:
問:Smith在哪裏工做?
答:SQL> select loc from dept, emp where ename = 'SMITH' and emp.deptno = dept.deptno;

2、集合查詢[請參考PowerPiont教程:SQL講稿.ppt P29,30,31]
集合操做是將多個基表的查詢結果做UNION運算。
交操做: Intersect
差操做:MINUS


3、子查詢(Subqueries):
子查詢是在where子句中包含的查詢語句,是由系列簡單構成的複雜查詢。

問:誰與smith在同一部門工做?
答:SQL> select deptno from emp where ename = 'SMITH';
SQL> select ename from emp where deptno = 20;

將兩個語句合起來:Select ename from emp where deptno = ( select deptno from emp where ename = 'SMITH');


[第十章 Oracle 權限設置]

1、權限分類:
系統權限:系統規定用戶使用數據庫的權限。(系統權限是對用戶而言)。

實體權限:某種權限用戶對其它用戶的表或視圖的存取權限。(是針對表或視圖而言的)。

2、系統權限管理:
一、系統權限分類:
DBA: 擁有所有特權,是系統最高權限,只有DBA才能夠建立數據庫結構。

RESOURCE:擁有Resource權限的用戶只能夠建立實體,不能夠建立數據庫結構。

CONNECT:擁有Connect權限的用戶只能夠登陸Oracle,不能夠建立實體,不能夠建立數據庫結構。

對於普通用戶:授予connect, resource權限。
對於DBA管理用戶:授予connect,resource, dba權限。

二、系統權限受權命令:
[系統權限只能由DBA用戶授出:sys, system(最開始只能是這兩個用戶)]
受權命令:SQL> grant connect, resource, dba to 用戶名1 [,用戶名2]...;

[普通用戶經過受權能夠具備與system相同的用戶權限,但永遠不能達到與sys用戶相同的權限,system用戶的權限也能夠被回收。]

例:
SQL> connect system/manager
SQL> Create user user50 identified by user50;
SQL> grant connect, resource to user50;

查詢用戶擁有哪裏權限:
SQL> select * from dba_role_privs;
SQL> select * from dba_sys_privs;
SQL> select * from role_sys_privs;

刪除用戶:SQL> drop user 用戶名 cascade;  //加上cascade則將用戶連同其建立的東西所有刪除

三、系統權限傳遞:
增長WITH ADMIN OPTION選項,則獲得的權限能夠傳遞。

SQL> grant connect, resorce to user50 with admin option;  //能夠傳遞所獲權限。

四、系統權限回收:系統權限只能由DBA用戶回收
命令:SQL> Revoke connect, resource from user50;

系統權限無級聯,即A授予B權限,B授予C權限,若是A收回B的權限,C的權限不受影響;系統權限能夠跨用戶回收,即A能夠直接收回C用戶的權限。

3、實體權限管理
一、實體權限分類:select, update, insert, alter, index, delete, all  //all包括全部權限
execute  //執行存儲過程權限

user01:
SQL> grant select, update, insert on product to user02;
SQL> grant all on product to user02;

user02:
SQL> select * from user01.product;

// 此時user02查user_tables,不包括user01.product這個表,但若是查all_tables則能夠查到,由於他能夠訪問。


3. 將表的操做權限授予全體用戶:
SQL> grant all on product to public;  // public表示是全部的用戶,這裏的all權限不包括drop。

[實體權限數據字典]:
SQL> select owner, table_name from all_tables; // 用戶能夠查詢的表
SQL> select table_name from user_tables;  // 用戶建立的表
SQL> select grantor, table_schema, table_name, privilege from all_tab_privs; // 獲權能夠存取的表(被受權的)
SQL> select grantee, owner, table_name, privilege from user_tab_privs;   // 授出權限的表(授出的權限)

4. DBA用戶能夠操做全體用戶的任意基表(無需受權,包括刪除):
DBA用戶:
SQL> Create table stud02.product(
 id number(10),
 name varchar2(20));
SQL> drop table stud02.emp;

SQL> create table stud02.employee
 as
 select * from scott.emp;
 
5. 實體權限傳遞(with grant option):
user01:

SQL> grant select, update on product to user02 with grant option; // user02獲得權限,並能夠傳遞。

6. 實體權限回收:
user01:
SQL>Revoke select, update on product from user02;  //傳遞的權限將所有丟失。


4、同義詞(Synonym):

一、建立私有同義詞:
語法:SQL> create synonym 同義詞名 for 代替項;

user01:
SQL> grant select, upate on product to user02;

user02:
SQL> Create synonym product for user01.product;

SQL> select * from product;  // 這裏的product即user01.product。

同義詞數據字典:
SQL> select synonym_name, owner, table_name from all_synonyms;
SQL> select synonym_name, table_name from user_synonyms;

二、DBA能夠建立公共同義詞(Public Synonym):公共同義詞全體用戶能夠存取
語法:SQL> create public synonym 公共同義詞名 for 代替項;

SCOTT:
SQL> grant select on payment to public;

SYSTEM:
SQL> create public synonym payment for scott.payment;


3. 刪除同義詞:
User:SQL> drop synonym 私有同義詞名;

DBA: SQL> drop public synonym 公共同義詞名;


[PL/SQL程序設計]

1、PL/SQL概述
PL/SQL塊結構:
Declare
 -- 變量定義部分
Begin
 -- 可執行語句
Exception
  -- 例外處理:對於程序運行中的錯誤信息、警告信息的說明
End;
.  // 以.號結束程序編寫

2、PL/SQL語言的特色(參考PowerPoint教程)
1. PL/SQL中能夠定義變量,變量有其做用範圍。
2. PL/SQL是以塊的方式設計,塊中能夠嵌套子塊,子塊能夠位於塊中任何部分。
3.

x. PL/SQL是以塊爲單位,SQL語句以語句爲單位。

7. 減小對Oracle核心的訪問,下降網絡負載。

3、PL/SQL與SQL語言(參考PowerPoint教程)
1. PL/SQL語句不能使用DDL語句。
能夠使用的SQL語句:Insert, Update, Delete, [select into], commit, rollback, savepoint

...

4、PL/SQL基礎
1. 變量的使用
2. 單行註釋:--
  多行註釋:/*   */

3. 數據類型:
(1)布爾型: Boolean(TRUE, FALSE, NULL)
(2)數字型:NUMBER
INT = INTEGER

(3) 字符型,基本上沒有變化
(4) 日期型
(5) 二進制數據:raw, blob

4. 數據定義:
 變量名 數據類型
 變量名 數據類型:=初始值

5. 變量賦值:變量 := 值;

[*]%TYPE:數據類型匹配

s1 char(20);
s2 s1%TYPE; // 定義s2變量,其類型與s1徹底匹配。

v_sal emp.sal%type;  // v_sal變量的類型與emp表中的sal字段的數據類型徹底匹配,%TYPE最常用的方法

[*] %ROWTYPE: 行類型,用於存儲數據庫基表的一條記錄。
定義方法:變量 基表名%rowtype;

例:
SQL> set serveroutput on  // 使能屏幕打印函數的輸出

Declare // 若是PL/SQL程序中沒有定義變量,那麼Declare能夠省略
 v_empno emp.empno%type := &empno;
 r emp%rowtype;
Begin
 select * into r from emp where empno = v_empno;
 dbms_output.put_line('姓名'|| r.ename||'工資'||r.sal||'日期'||r.hiredate); 
 // r.字段名:表示某一列的值;dbms_output.putline()是一個屏幕打印函數
End;


[*] 記錄類型Record:
 record:
Declare
 v_empno emp.empno%type := &empno;
 // 定義record類型
 type r_emp is record(
  v1 emp.ename%type,
  v2 emp.job%type,
  v3 emp.hiredate%type);
 
 r r_emp;   -- 定義變量r爲record類型r_emp
Begin
 select ename, job, hiredate into r from emp where empno = v_empno;
 dbms_output.put_line('姓名:'|| r.v1||'職務:'||r.v2||'工做時間:'||r.v3);
End;

[*] Table類型:相似於C語言中的結構類型數組:
定義方法:TYPE [table_emp] is Table of [emp.ename%type] index by binary_integer;  // []內爲用戶能夠修改的部分

使用:mytable = table_emp;
 mytable(0) := 'SCOTT';
 ...
例:
Declare
 v_empno emp.empno%type := &empno;
 type t_emp is table of emp.ename%type index by binary_integer;
 
 t t_emp;
Begin
 select ename into t(10) from emp where empno = v_empno;
 dbms_output.put_line('編碼爲'||v_empno||'的員工是'||t(10));
End;

5、條件控制語句:條件判斷語句
1. IF-THEN語句:
IF 條件成立 THEN
 可執行語句; 
END IF;

Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
    Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
      if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
       dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
      End if;
    End;
   

2. IF-THEN-ELSE語句

IF 條件成立 THEN 
 執行語句1;
ELSE
 執行語句2;
END IF;

Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
      if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
       dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
      Else dbms_output.put_line('員工'||v_ename||'的工資已經超過規定值,不予更新!');
      End if;
End;
 
3. IF-THEN-ELSIF語句
     IF       條件1成立  THEN  執行語句1;
     ELSIF 條件2成立  THEN   執行語句2;
     ELSIF 條件3成立  THEN   執行語句3;
     ...
     END  IF;
    
Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
    Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
       if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
        dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
        elsif v_sal<2500 then Begin
                  update emp set sal=sal+50
                  where empno=v_empno;
        dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
        elsif v_sal<3000 then Begin
                  update emp set sal=sal+10
                  where empno=v_empno;
        dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
        else dbms_output.put_line('員工'||v_ename||'的工資已經超過規定值,不予更新!');
        End if;
    End;
 
6、循環語句:
1. 基本循環:
LOOP
       執行語句;
EXIT WHEN 條件成立;
END LOOP;

例:
Declare
         v_deptno emp.deptno%type:=&deptno;
         i number(2):=0;
     Begin
         loop
           i := i +1;
           insert into emp(empno,hiredate,deptno)
           values(i+7200,sysdate,v_deptno);
           dbms_output.put_line('i的當前值爲:'||i);
          exit when i=10;
          end loop;
    End;

2. WHILE循環:

WHILE 條件成立
LOOP 執行語句;
END LOOP;

Declare
         v_deptno emp.deptno%type:=&deptno;
         i number(2):=0;
     Begin
         while i  < 10   loop
           i := i +1;
           insert into emp(empno,hiredate,deptno)
           values(i+7200,sysdate,v_deptno);
           dbms_output.put_line('i的當前值爲:'||i);
       --   exit when i=10;
          end loop;
    End;
   
3. FOR循環:
FOR 計數器 IN 低界..高界
LOOP 執行語句;
END LOOP;

例:
Declare
         v_deptno emp.deptno%type:=&deptno;
         i number(2):=0;
     Begin
         while i  < 10   loop
           i := i +1;
           insert into emp(empno,hiredate,deptno)
           values(i+7200,sysdate,v_deptno);
           dbms_output.put_line('i的當前值爲:'||i);
       --   exit when i=10;
          end loop;
    End;


7、光標設計(Cursor):

一、什麼是光標?在PL/SQL中,當查詢語句執行結果超過一行時,爲處理每一行,必須定義一個cursor,叫光標。


二、光標使用方法:
(1) 定義光標:
語法:光標名 is select 語句;

(2) 打開光標:
語法:open 光標名;

(3) 取數據:
語法:Fetch 光標名 into 變量;

(4) 光標下移:使用loop循環

(5) 關閉光標:close 光標名;

例:
Declare
        v1 emp.empno%type;
        v2 emp.ename%type;
        v3 emp.sal%type;
        cursor c is select empno,ename,sal from emp;
     Begin
         open c;
         loop
         fetch  c into v1,v2,v3;
         if v3<3000 then Begin
                           update emp set sal=sal+100
                           where empno=v1;
                    dbms_output.put_line('員工'||v2||'工資已經更新!');
                                    End;
         end if;
         exit when c%NOTFOUND;
         end loop;
         close c;
     End;
/


-- //要求從emp表中取出按用戶輸入要求的前幾位工資最高的人員及其工資放入topsalary表中:
-- // 個人方法:
SQL>create table topsalary (
 name varchar2(20),
 sal number(7,2));
 
SQL>Declare
  vcount number(7) := &n;
  i number(7) :=0;
        vname emp.ename%type;
        vsal emp.sal%type;
        cursor c is select ename,sal from emp order by nvl(sal,0) desc; --// 使用nvl函數防止工資出現空值的狀況,老師補充
     Begin
      delete topsalary;  -- // 先清空topsalary表
         open c;
        
         for i in 1 .. vcount loop
         fetch  c into vname, vsal;
        
         insert into topsalary values(vname,vsal);
        
         end loop;
         close c;
     End;
 
--//教師的方法
Declare
    i number(3) :=&i;
    j number(3) :=0;
   cursor c is select ename,sal from emp order by nvl(sal,0) desc;
   v1 emp.ename%type;
   v2 emp.sal%type;
Begin
   open c;
   loop
   j := j+1;
   fetch c into v1,v2;
   insert into topsalary  values(v1,v2);
   exit when j=i;
   end loop;
   close c;
End;

3. 光標屬性:  每個光標有四種屬性
%FOUND         查詢語句(FETCH語句)返回記錄
%NOTFOUND      查詢語句(FETCH語句)無返回記錄,用於循環退出條件
%ROWCOUNT     FETCH已獲取的記錄數
%ISOPEN        光標已打開標記

例:
Declare
        v1 emp.empno%type;
        v2 emp.ename%type;
        v3 emp.sal%type;
        cursor c is select empno,ename,sal from emp;
     Begin
         open c;
         loop
         fetch  c into v1,v2,v3;
         if v3<3000 then Begin
                           update emp set sal=sal+100
                           where empno=v1;
                    dbms_output.put_line('員工'||v2||'工資已經更新!');
                                    End;
         end if;
         exit when c%NOTFOUND;
         end loop;
         dbms_output.put_line('光標處理的行數:'||C%ROWCOUNT);
         close c;
     End;
    
4. 隱式光標處理: 隱式光標是指在處理SQL時,不需定義光標,所使用的SQL語句包括:INSERT ,UPDATE,DELETE子句。

隱式光標屬性:       SQL%FOUND        SQL%NOTFOUND              SQL%ROWCOUNT

隱式光標的使用:
Declare
 v_empno emp.empno%type:=&empno;
Begin
 delete from emp where empno=v_empno;
 if SQL%NOTFOUND then
  dbms_output.put_line('你的刪除失敗,數據庫無此人:'||v_empno);
 end if;
End;


[例外處理Exception]
Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
       if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
        dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
        elsif v_sal<2500 then Begin
                  update emp set sal=sal+50
                  where empno=v_empno;
        dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
        elsif v_sal<3000 then Begin
                  update emp set sal=sal+10
                  where empno=v_empno;
        dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
        else dbms_output.put_line('員工'||v_ename||'的工資已經超過規定值,不予更新!');
        End if;
Exception   -- // 例外處理
 when NO_DATA_FOUND then dbms_output.put_line('數據庫中沒有編碼爲'||v_empno||'的員工。');
 when TOO_MANY_ROWS then
  dbms_output.put_line('你的查詢語句返回結果出現多行,請定義光標後重試!');
 when OTHERS then
  dbms_output.put_line('你的程序是錯誤的,請仔細檢查後重試!');
End;

[用戶定義的例外]
(1)在Declare段定義
(2)在Begin段中用Raise引發。
(3)在Exception段中使用。

Declare
       v_empno emp.empno%type :=&empno;
       no_result exception;
Begin
 delete from emp where empno = v_empno;
 if SQL%NOTFOUND then raise no_result;
 end if;
 
Exception   -- // 例外處理
 when NO_DATA_FOUND then dbms_output.put_line('數據庫中沒有編碼爲'||v_empno||'的員工。');
 when NO_RESULT then dbms_output.put_line('數據庫中沒有編碼爲'||v_empno||'的員工。');
 when TOO_MANY_ROWS then
  dbms_output.put_line('你的查詢語句返回結果出現多行,請定義光標後重試!');
 when OTHERS then
  dbms_output.put_line('你的程序是錯誤的,請仔細檢查後重試!');
End;

[存儲過程(Storage Procedure)與函數(Function)設計]

1、什麼是存儲過程?
 存儲過程(函數)是把一個PL/SQL塊存儲到數據庫中,做爲一個數據庫實體,能夠在其它存儲過程、函數、應用程序中調用。
一、存儲過程的調用方法:
(1) 在SQL*Plus中調用方法:SQL> Execute 存儲過程名稱; // execute 能夠簡寫爲Exec。
(2) 在其它存儲過程、函數、應用程序中調用方法:存儲過程名稱;

二、存儲過程的設計方法:
編寫程序->在SQL*PLUS中編譯->修改錯誤->調用執行。

2、建立存儲過程的語法:[參考PowerPoint教程:存儲過程1.ppt(P3)]
說明:
 IN: 調用者向過程傳遞參數
 OUT: 過程向調用者傳遞參數
 IN OUT: 雙向傳遞參數
 無Declare

[例1:]IN: 刪除數據
Create or Replace procedure DelEmp(v_empno in emp.empno%type) is
Begin
 delete from emp where empno=v_empno;
 dbms_output.put_line('編碼爲'||v_empno||'的員工已被除名!');
End DelEmp;

調用方法:
SQL> Exec DelEmp(7788);
SQL> Exec DelEmp(7934);


[例2:]IN: 插入數據
Create or Replace procedure InsertEmp( v_empno in emp.empno%type,
        v_ename in emp.ename%type,
        v_deptno in emp.deptno%type) is
Begin
 insert into emp(empno, ename, hiredate,deptno)
  values(v_empno, v_ename, sysdate, v_deptno);
 dbms_output.put_line('新員工「'||v_ename||'」錄入成功!');
End InsertEmp;

[例3:]IN、OUT:數據查詢
Create or Replace procedure QueryEmp(v_empno in emp.empno%type,
                                     v_ename out emp.ename%type,
                                     v_job out emp.job%type) is
Begin
  select ename,job into v_ename,v_job from emp
  where empno=v_empno;
End QueryEmp;

調用方法:
Declare
  v1 emp.ename%type;
  v2 emp.job%type;
   v  emp.empno%type:=&empno;
Begin
    QueryEmp(v,v1,v2);
   dbms_output.put_line('編碼爲'||v||'的員工姓名是:'||v1||'職業是:'||v2);
End;


[* 查詢存儲過程源代碼:]
SQL> select text from user_source where name = 'DELEMP';  // 名字要大寫


3、建立函數語法:
例1:
Create or replace Function GetSalary( v empno%type) return numbwr is
 v_sal emp.sal%type;
Begin
 select sal into v_sal from emp
 where empno=v;
 return v_sal;
End GetSalary;
 
 [調用方法:]
 (1) SQL> Exec dbms_output.put_line(GetSalary(7788));
 (2) SQL> select GetSalary(7788) from dual;
 (3) 使用PL/SQL的方法:
 Begin
  dbms_output.put_line(GetSalary(7788));
 End;

[函數例2]
Create or replace function getmaxsal
return number
is
 v_maxsal emp.sal%type;
 begin
   select max(sal) into v_maxsal from emp;
   return v_maxsal;
 end getmaxsal;
 
  [調用方法:]
 (1) SQL> Exec dbms_output.put_line(GetMaxSal);
 (2) SQL> select GetMaxSal from dual;
 (3) 使用PL/SQL的方法:
 Begin
  dbms_output.put_line(GetMaxSal);
 End;
 
[練習題]: 求n!函數(n的階乘)。

[個人答案]
Create or replace function nj(n in number)
 return number
 is
   numtmp number;
 Begin
   if n = 0 then
    numtmp := 1;
   else
    numtmp := n * nj(n - 1);
   end if;
  
   return numtmp;
 End nj;
 
 [教師的答案]// 高, 實在是高!!!
Create or replace function fn(n in number)
return number
is
 Begin
  if n=0 then return 1;
 else return n*fn(n-1);
 end if;
End fn;

4、存儲過程及函數管理:
一、查詢存儲過程及函數的源代碼:
SQL> select * from user_source;
SQL> select * from dba_source;
SQL> select * form all_source;

二、存儲過程及函數的權限管理:
受權命令:
SQL> grant execute on 過程(或函數) to 用戶名;
SQL> grant execute on 過程(或函數) to public;  --//受權給全體用戶

權限回收:
SQL> Revoke execute on 過程(或函數) from 用戶名;
SQL> Revoke execute on 過程(或函數) from public;

三、查詢錯誤信息:
SQL> select * from user_errors;
SQL> show errors;

四、查詢依賴性信息:
依賴性:實體的結構定義修改時,對建立在這些實體上的存儲過程及函數的影響叫依賴性。

顯示依賴性關係:
SQL> select name,type, referenced_owner, referenced_name, referenced_type from user_dependencies;

五、刪除存儲過程及函數:
SQL> drop procedure 過程名;
SQL> drop function 函數名;


[包(Package)的設計與開發]

1、什麼是包?
    把一些相關的存儲過程、函數、變量、光標、例外等組合在一塊兒造成的對象叫包。包由包的說明部分及包體兩部分組成。定義在包說明部分的是公共元素,定義在包體的部分是私有元素。

2、使用包的優勢:     
   一、規範化程序設計
   二、方便過程及函數的組織
   三、便於管理:包的受權只需一次完成
   四、優化系統性能:整個包做爲一個總體一次調入內存。


3、包的開發步驟:
一、建立包的說明部分:Create package
二、建立包體部分:Create package body
三、在SQL*Plus中運行建立包
四、在存儲過程、其它應用中調用。
在SQL*Plus中調用方法:SQL> exec 包名.過程名;

在存儲過程、函數、其它應用中調用方法:包名.過程名;

4、建立包的語法:
一、建立包(說明部分):請參考PowerPoint教程:存儲過程1.ppt[Page10]

二、建立包體(Create Package Body): 請參考PowerPoint教程:存儲過程1.ppt[Page11]

三、例:請參考PowerPoint教程:存儲過程1.ppt[Page十二、1三、1四、15]

5、包的刪除:
SQL> drop package 包名;
SQL> drop package body 包名;

查詢包源代碼:
SQL> select text from user_source where name = '包名';  // 包名大寫。


[數據庫觸發器(Triggers)設計與開發]

1、 什麼是觸發器?
數據庫觸發器是一個存儲的PL/SQL程序塊,它與一個基表聯繫,當在表上執行特定的數據庫維護(插入、刪除、更新這三種操做)時,隱含地執行一個PL/SQL程序塊。

2、觸發器的做用:
 。防止非法的數據庫操縱、維護數據庫安全
 。對數據庫的操做進行審計,存儲歷史數據
 。完成數據庫初始化處理
 。控制數據庫的數據完整性
 。進行相關數據的修改
 。完成數據複製
 。自動完成數據庫統計計算
 。限制數據庫操做的時間、權限等,控制實體的安全性
 
3、觸發器的組成:
一、觸發時間:觸發器事件的時間次序(before, afer)[2]

二、觸發事件:什麼SQL語句會引發觸發器觸發(Insert, delete, update)[3]

三、觸發子體:觸發器觸發時要執行的操做(一個完整的PL/SQL程序)

四、觸發類型:觸發器被執行的次數(語句級、行級)[2] //語句級只執行一次,行級會執行屢次。

[*]一個表上最多能夠建立12個不一樣類型的觸發器:3*2*2 = 12

4、建立觸發器注意事項:
一、在觸發器中能夠調用存儲過程、包;在存儲過程當中不得調用觸發器。

二、在觸發器中不得使用commit, rollback, savepoint語句。

三、在觸發器中不得間接調用含有commit, rollback, savepoint的語句的存儲過程及函數。

5、建立語句級觸發器:
語句級觸發器: 請參考PowerPoint教程:存儲過程1.ppt[Page19] 該觸發器在數據庫操做時只執行一次。
說明:
 。update中的of是可選項,用於指定語句要修改的列
 。要建立的觸發器已經存在時,使用replace選項

//例1:before型觸發器:
Create or replace trigger DelEmp
  before delete on emp
  Begin
   if (To_Char(sysdate,'dy') in ('星期六','星期日') or
        To_number(To_Char(sysdate,'hh24'))  not between  8   and 18)
   then dbms_output.put_line('如今是非工做時間,請退出!!!');
   end if;
  End;

[觸發器數據字典]
SQL> select table_owner, table_name,trigger_body from user_triggers where trigger_name='DELEMP';

//例2:After型觸發器:
Create or replace trigger InsertEmp
after insert on emp     // 若是是before,就會比after的結果少一名。
Declare
 v_empcount number(7);
Begin
 select count(*) into v_empcount from emp;
 dbms_output.put_line('目前員工總數已達到:'|| v_empcount|| '名。');
End;


//例3:多個觸發條件
Create or replace trigger ChangeEmp
before delete or insert or update on emp
Begin
   if (To_Char(sysdate,'dy') in ('星期六','星期日') or
        To_number(To_Char(sysdate,'hh24'))  not between 8 and 18)
   then dbms_output.put_line('如今是非工做時間,請不要修改數據!!!');
   end if;
End;

// 更完善的寫法:
Create or replace trigger ChangeEmp
  before delete or insert or update  on emp
  Begin
   if (DELETING and (To_Char(sysdate,'dy') in ('星期六','星期日') or
        To_number(To_Char(sysdate,'hh24'))  not between  8   and 18))
   then dbms_output.put_line('如今是非工做時間,不要刪除數據!');

   elsif (UPDATING and (To_Char(sysdate,'dy') in ('星期六','星期日') or
        To_number(To_Char(sysdate,'hh24'))  not between  8 and 18))
   then dbms_output.put_line('如今是非工做時間,不要更新數據!');

   elsif (INSERTING and (To_Char(sysdate,'dy') in ('星期六','星期日') or
        To_number(To_Char(sysdate,'hh24'))  not between  8   and 18))
   then dbms_output.put_line('如今是非工做時間,不要插入數據!');

   end if;
  End;

6、建立行級觸發器:
等級觸發器:增長選項for each row, 使觸發器在每一行上觸發。

一、建立行級觸發器注意事項:
(1) 在行級觸發器中,在列名前增長old表示該列修改前值,增長new表示該列修改後值。
(2) 在PL/SQL中引用時,前邊增長冒號。
 
[例4: 行級觸發器] //必須是對全部的行進行操做才行。
Create or Replace trigger UpdateEmp
Before update on emp
for each row
Begin
 dbms_output.put_line(:old.sal||'--------->'||:new.sal);
End;

[例5:保存歷史數據,這種使用方法很重要,用來保存關鍵錶的歷史數據]
CReate or Replace trigger ChangeEmp
Before update or delete on emp
for each row
Begin
 Insert into oldemp(empno, ename,job,hiredate,sal)
 values(:old.empno,:old.ename,:old.job,sysdate,:old.sal);
End;

SQL> create table oldemp
 as select empno, ename,job,hiredate,sal from emp where 1>2;

[例6:修改外鍵]
Create or Replace trigger UpdateDept
after update on dept
for each row
Begin
 update emp
  set emp.deptno = :new.deptno
  where emp.deptno = :old.deptno;
End;

[例7:刪除外鍵、刪除相關數據]
Create or Replace trigger DeleteDept
before delete on dept
for each row
Begin
 delete from emp where deptno = :old.empno;
End;

7、觸發器管理
一、使觸發器失效:
SQL> alter trigger 觸發器名稱 disable;  // 失效
SQL> Alter Trigger 觸發器名稱 enable;  // 生效

SQL> Alter table 表名 DISABLE all triggers; // 一個表上的全部觸發器失效
SQL> Alter table 表名 ENABLE all triggers; // 使一個表上的全部觸發器生效

SQL> Drop Trigger 觸發器名;  // 刪除觸發器;


[第一章] Oracle 數據庫體系結構
物理結構
邏輯結構
內存結構
進程結構

[數據庫管理員DBA(Database Administrator)]
DBA職責:
。Oracle核心軟件安裝與產品升級
。爲數據庫系統分配存儲空間及規劃將來存儲需求
。建立數據庫存儲結構
。用戶權限與角色管理
。監視與控制用戶對數據庫的存儲
。維護數據庫安全
。完成數據庫備份與恢復
。監視與優化數據庫性能

1、物理結構:數據庫是由構成數據庫的操做系統文件所組成。
UNIX:/u01/app/oracle/oradata/db_name/ *.*
Windows NT/2000: D:/Oracle/oradata/db_name/*.*

//爲保證數據安全,只要將此目錄中的全部文件備份便可。 Control0X.CTL文件(X爲1,2,3)是同樣的,只要有一個無缺就能夠。

包含三類物理文件:
一、數據文件(DataFiles):存儲數據庫數據的文件,表、索引、存儲過程等都存儲在數據文件中。

[*]查詢數據文件信息:
SQL> select * from dba_data_files;

/* 數據文件的大小隻是表示有多少存儲數據的空間,並不表示數據量的大小。*/

[*]查詢表空間空閒空間:
SQL> select * from dba_free_space;  // 顯示結果中包括碎片
SQL>select tablespace_name, sum(bytes) from dba_free_space
 group by tablespace_name;
 
[*] 表空間碎片合併命令:
SQL> alter tablespace 表空間名 coalesce;

SQL> alter tablespace temp coalesce;

[*]數據塊大小控制參數:db_block_size = 2K - 32K
在數據庫安裝後,數據塊大小不得修改。

系統缺省值以下:
Oracle7, Oracle8, Oracle8i 8.1.5: 2048(2K)

Oracle8i 8.1.6: 8192(8K)

Oracle8i 8.1.7: 8192(8K)

這個參數存儲在d:/oracel/admin/db_name/pfile/init.ora文件中。

SQL> select bytes, blocks, blocks*8192, file_name from dba_data_files;

數據文件的大小都是數據塊的整數倍。數據塊的大小在數據庫安裝以前確實,數據庫安裝以後就不能再修改。

[*] 顯示數據塊大小:
(1) d:/svrmgrl
SVRMGR> connect internal/oracle

SVRMGR> show parameter db_black_size

SQL> select value form v$parameter where name='db_block_size'; (小寫)

[1.1] 在Oracle數據庫中,數據文件大小能夠修改,命令以下:
SQL> Alter database datafile '數據文件名及路徑' resize xxM;

SQL> alter database datafile 'd:/oracle/oradata/ora8i/system01.dbf' resize 100m;
// 上一行中ora8i在具體系統中應該是相應的數據庫名

更改以前,查詢相應磁盤是否有空閒空間。
用相同的方法能夠壓縮數據文件的大小,但不能小於已經存儲的數據的大小。

[1.2] 在Oracle8i數據庫中,數據文件的大小能夠自動擴展,命令以下:
SQL> Alter database datafile '數據文件名及路徑' autoextend on;  --//該數據文件容許自動擴展(缺省)

SQL> Alter database datafile '數據文件名及路徑' autoextend off; --//該數據文件不容許自動擴展

[*] 查詢數據文件自動擴展屬性:
SQL> select bytes, autoextensible, maxbytes, file_name from dba_data_files;

SQL> Alter database datafile '數據文件名及路徑' autoextend on
 next 50m  -- // 每次擴展50M
 maxsize 1000m ; --// 最大擴展到1000M,若是unlimited,則受磁盤大小的限制
 
[*] 查詢每次擴展量:
SQL> select bytes, increment_by, file_name from dba_data_files;

[安全起見,建議把自動擴展關閉]


[C.1] Sun Enterprise 6500: 8 * 34G
system01.dbf ==> 33G

SQL> Alter table emp deallocate unused;  --// 壓縮表未用空間

二、日誌文件(Redo log files):記錄數據庫修改先後的信息,用於數據庫恢復。

每個數據庫至少有兩個日誌文件組,每組有一個或多個日誌成員文件。每一個組的成員文件的缺省大小是1M。

[*]假設有三個組,每一個組有三個成員文件,Oracle的日誌工做流程(歸納起來爲循環覆蓋):

(1) 每一個組中的日誌成員文件之間的關係是鏡像關係,每一個成員分別存儲到不一樣的物理磁盤上,只有所有損壞,這個組纔算損壞。若是隻有一個成員,則這個數據庫是不安全的。

(2) 在同一個時刻,只有一個組在工做。當第一組不能所有存放要記錄的數據時,則轉換到第二組,若是第二組仍然寫不下,則轉到第三組,第三組仍然存不下,則再轉 回到第一組。若是第一組日誌的歸檔模式爲歸檔日誌,則第一組日誌中存儲的數據歸檔到磁盤或者磁帶上,而後數據被覆蓋,若是是非歸檔日誌(默認模式,建議改 變爲歸檔模式),則新的數據直接覆蓋第一組的數據,這種狀況就會形成數據丟失。

[*] 確認數據庫(日誌)歸檔方式:
SQL> select log_mode from v$database;

SVRMGR> archive log list

[C*] Oracle的數據庫恢復
不徹底數據庫恢復:經過備份來回退,會形成部分數據的丟失
徹底數據庫恢復:數據不會丟失。
兩種狀況下都須要用到日誌,日誌對於數據庫的恢復相當重要。

[*]
(1) 在線日誌:v$log  // 當前使用的日誌,current
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  CURRENT                 153302 2002年04月
         2          1        197    1048576          1 NO  INACTIVE                112335 2002年04月
         3          1        198    1048576          1 NO  INACTIVE                132450 2002年04月
        
[若是當前日誌文件損壞,則數據庫沒法恢復。(打死也恢復不了)。]
[C*]日誌文件組的名稱是:REDO0X.LOG(X=1,2,3)。
[對於Oracle數據庫來講,還有一個關鍵文件是SYSTEM01.DBF,若是這個文件壞了,整個數據庫系統沒法啓動,數據也會所有丟失。]

[!!! 必定要作好數據庫及日誌的備份!!!]

日誌文件:v$logfile  // 日誌文件
歸檔日誌:v$archived_log  // 日誌組切換時歸檔到磁盤或者磁帶上的日誌

(4) 歷史日誌:v$log_history  // 日誌的歷史記錄
SQL> select * from v$log_history;

[*] Redo Log 文件鏡像
(1) 一組中Redo Log文件具備相同的信息。
(2) 選擇合適的日誌文件大小(不能過小,過小容易致使頻繁的切換,從而致使過多的磁盤I/O,下降系統的性能)。
[C*] 內存的多少對數據庫系統性能的影響是最重要的,日誌雖然對系統性能有影響,但沒有內存關鍵,內存必定要大。

[C*] Oracle數據庫最大化參數:
maxlogmembers: 最大值是5,缺省值是2。
maxlogfiles:最大254,缺省32個。 // 最大的日誌文件個數
maxdatafiles:最大65534, 缺省254。
maxloghistory:最大65534,缺省65534
maxinstances: 最大63,缺省1。

[組不須要太多,至少三個,四個通常就能夠了]

[C* 不一樣日誌文件組的文件大小能夠不一樣,兩個組中文件的個數也能夠不一樣]
(3) 組中的成員同時被更新。
... [請參考PowerPoint教程]

[*] 日誌切換:
DBA強制日誌切換命令:SQL> alter system switch logfile;


[*] 在Oracle中,文件的擴展名沒有任何意義,從如下數據字典中查詢相應的文件的文件名
(1) 表空間文件*.dbf: dba_data_file, v$datafile
(2) 日誌文件*.log: v$logfile
(3) 控制文件*.ctl: v$controlfile

SQL> select * from v$log;

查詢數據文件同步號:SQL> seelct file#, checkpoint_change#, from v$datafile;

控制文件同步號:SQL> select checkpoint_change# from v$database;

/* 隨着日誌的切換或者時間的推移,文件的同步號不斷改變,若是上述同步號不一致,代表數據庫出現問題;由此,不能將不一樣機器上的單個數據庫文件互相拷貝,因 爲同步號不一致,只能把一臺機器上的全部數據文件同時拷貝到另外一臺機器上才能夠使用。Oracle的同步號以控制文件(*.ctl)中的爲準。 */

Oracle不提供修改同步號的命令。若是在一個數據庫中出現同步號不一致的狀況,說明這個數據庫的數據已經有不一致的部分,緣由多是進行了不徹底恢復,只有當數據徹底恢復後,同步號才能從新變得一致。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  CURRENT                 153302 2002年04月
         2          1        197    1048576          1 NO  INACTIVE                112335 2002年04月
         3          1        198    1048576          1 NO  INACTIVE                132450 2002年04月
上述顯示結果中的SEQUENCE#的最大值是65534,若是達到最大值,會自動清零,從頭開始。


[*]日誌管理與配置命令
A. 增長日誌文件組:
SQL> Alter database ADD
 logfile group n('第一個日誌成員文件','第二個日誌成員文件') size xxM;
// n爲組號。第二個日誌成員文件爲可選的,兩個成員文件最好放到不一樣的物理磁盤上。

SQL>Alter database ADD
 logfile group 4('d:/oracle/oradata/ora8i/log41.log', 'd:/oracle/oradata/ora8i/log42.log')
 size 5m;

SQL>Alter database ADD
 logfile group 4('d:/oracle/oradata/ora8i/log41.log', 'd:/oracle/oradata/ora8i/log42.log')
 REUSE; // 若是在相應的路徑下存在同名文件,請加Reuse直接覆蓋原來的文件。
 

[C*]: Oracle不提供修改原來的日誌組的屬性(文件大小)的命令,解決辦法是先建立新的,而後刪除舊的

// ************************************* 實際操做內容 ************************************************
SQL> Alter database ADD
  2   logfile group 4('d:/oracle/oradata/ora54/ReDo41.log', 'd:/oracle/oradata/ora54/ReDo42.log')
  3   size 5m;


數據庫已更改。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  CURRENT                 153302 2002年04月
         2          1        197    1048576          1 NO  INACTIVE                112335 2002年04月
         3          1        198    1048576          1 NO  INACTIVE                132450 2002年04月
         4          1          0    5242880          2 YES UNUSED                       0

SQL> alter system switch logfile;

系統已更改。

SQL> /

系統已更改。

SQL> /

系統已更改。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  INACTIVE                153302 2002年04月
         2          1        201    1048576          1 NO  INACTIVE                153435 2002年04月
         3          1        202    1048576          1 NO  CURRENT                 153436 2002年04月
         4          1        200    5242880          2 NO  INACTIVE                153434 2002年04月
/*****************************************************************************************************/

B. 刪除日誌文件組:
SQL> Alter database DROP logfile group n;

說明:(1)Current, Active組不得刪除,若是是歸檔日誌組,要求先歸檔,不然,該組狀態爲ACTIVE,不能刪除。
(2) 數據庫只有兩個日誌組時,不得刪除。
(3) 邏輯刪除後,再刪除物理文件。切記:不要刪除錯了文件,尤爲是在UNIX下,最好在刪除之間檢查正在使用的物理文件,(固然,若是刪除以前先備份文件更好)以下命令:
SQL> select * from v$logfile;

C. 增長日誌成員文件:
SQL> Alter database ADD logfile member '成員文件名及路徑' to group n;

D. 刪除日誌成員文件:
SQL> Alter database DROP logfile member '成員文件名及路徑';

說明:(1) Current, Active組的成員不得刪除;
(2) 日誌組只有一個成員時,不得刪除成員,能夠刪除組。

三、控制文件(Control Files):是描述數據庫結構的二進制文件。包括:
 。數據庫名db_name
 。數據庫建立的時間
 。所有數據文件名及路徑
 。所有日誌文件名及路徑
 。數據庫恢復時所需的同步信息
// 控制文件只須要一個,但在oradata目錄下有三個,另兩個是鏡像,三個文件內容相同。

(1) 查詢數據庫跟蹤文件信息(跟蹤文件記錄全部影響控制文件修改的命令):
D:/oracle/admin/db_name/bdump/SIDalrt.log // SID視具體狀況而定
/u01/app/oracle/admin/db_name/bdump/alert_sid.log

// 這個文件時間長了以後會變得很大,所以須要按期刪除。

(2) 建議設置:
 。至少設置兩個控制文件並保存於不一樣的磁盤。
 。在數據庫參數文件中的Control_files指明控制文件。
  . 控制文件能夠鏡像,能夠在安裝或者安裝完成後進行配置
  .
 
[(2).C] 數據庫參數文件名稱及路徑:
Unix:
/u01/app/oracle/admin/db_name/pfile/initSID.ora

Windows NT/2000:
D:/oracle/admin/db_name/pfile/init.ora

指明控制文件的參數:
control_files = ('file1', 'file2', 'file3')
例:
control_files = ( "D:/Oracle/oradata/ora54/control01.ctl",
    "D:/Oracle/oradata/ora54/control02.ctl",
    "D:/Oracle/oradata/ora54/control03.ctl")
   
(3) 查詢控制文件名及路徑:
SQL> select * from v$controlfile;

(4) 控制文控鏡像方法:
A. 關閉數據庫
B. 複製控制文件到目標路徑
C. 修改參數文件control_files,包含新的控制文件
D. 重啓數據庫

[DBA的圖形界面管理工具:DBA Studio]
啓動DBA Studio, 選擇「登陸到Management Server」:
登陸用戶:sysman, 密碼:oem_temp(默認,登陸成功後要求修改)

在登陸以前,要求Management Server服務已經啓動,同時已經在系統控制檯Console中搜索並增長(配置)了Management Server要管理的數據庫。

2、邏輯結構:
數據庫的邏輯結構包括:
。表空間(Tablespaces)
。段(Segments)
。區(Extents)
。數據塊(Data Blocks)

數據塊->區->段->表空間->(邏輯)數據庫
(1) 表空間://對應四種不一樣的段類型,Oracle有四種對應的表空間
 。數據表空間
 。索引表空間: INDX
 。臨時表空間: TEMP
 。回退表空間: RBS

(2) 段(Segments)的四種類型:
 。數據段:用來存儲基表數據
 。索引段:存儲索引數據
 。臨時段:用於排序(Order by)、彙總等
 。回退段:用於事務回退,rollback語句使用

// 臨時段和回退段佔的空間固定,不能增大。
// Oracle中最複雜的就是回退段管理。
// 每一個段的結構都大體相同,即包含若干個區,每一個區的大小又是數據塊的整數倍。
// 表空間是Oracle中最大的邏輯結構

一、表空間(Tablespaces):
(1)表空間的特色與做用:
。控制數據庫數據磁盤分配

。跨越磁盤存儲數據

。表空間經過離線(Offline)、在線(online)控制數據可用性。

[A]設置表空間offline、online、read only、read write屬性:
SQL> Alter tablespace 表空間名 offline;
SQL> Alter tablespace 表空間名 online;  // 正常狀態
SQL> Alter tablespace 表空間名 read only;
SQL> Alter tablespace 表空間名 read write; // 正常狀態

[system表空間不得offline]

[B]查詢表空間信息:
SQL> select * from dba_tablespaces;
SQL> select tablespace_name, status from dba_tablespaces;

。完成部分數據庫的備份與恢復

。表空間經過數據文件來擴大,表空間大小等於構成該表空間的全部數據文件大小之和。

[A] 查詢表空間與數據文件之間的關係:
SQL> select tablespace_name, file_name from dba_data_files;

二、段(Segments):
(1) 數據段:存儲基表數據的段,由Create table命令產生。用戶在建立基表時,則自動在用戶缺省表空間中建立一個數據段。
[A]查詢用戶與用戶缺省表空間對應關係:
SQL>select username, default_tablespace from dba_users;
[B] 查詢表與所在表空間的對應關係:
SQL> select table_name, tablespace_name from user_tables;

若是一個表有分區,則用上面這個命令沒法查詢表所使用的表空間,由於表使用了多個表空間。查詢方法以下:
SQL> select partition_name, segment_type, tablespace_naem from user_extents
 where segment_name = 'EMPLOYEE';

(2)、索引段:存儲索引數據的段,由Create index命令產生。用戶在建立索引時,則自動在用戶缺省表空間中建立一個索引段。
[A] 索引與所在表空間的對應關係:
SQL> select index_name, tablespace_name from user_indexes;

[B] 使用索引表空間建立索引:
SQL> create index emp_job on emp(job) tablespace indx;
// 若是不加tablespace indx,則索引默認建立在用戶缺省表空間中。

(3)臨時段:用戶排序、彙總時臨時工做空間。臨時段表空間在DBA建立用戶時肯定。建立用戶時未指定臨時表空間,則系統自動使用system表空間做爲臨時表空間使用。臨時表空間公用(temp)。
[A] 查詢用戶及所使用的臨時表空間:
SQL> select username, temporary_tablespace from dba_users;

// 建議不要使用system做爲用戶的臨時表空間,由於容易致使碎片。

[B]DBA能夠修改用戶的臨時表空間
SQL> Alter user 用戶名 temporary tablespace temp;

(4) 回退段:用於用戶在回退事務時使用。回退段由DBA建立,全體用戶公用。
[A] 查詢回退段及所對應的表空間:
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;

[B]爲何要設回退段?
回退段是數據庫的一部分,是Oracle 數據庫的一個重要參數,其設計是否正確直接影響到數據庫的動態性能。Rollback 段的使用用於保存一個事務的操做,以便在某些狀況下回退或取消操做。 每一個Oracle數據庫都有多個回退段。

[C] 回退段的做用
。併發操做時,保證數據的讀一致性。
。使用 SQL語句rollback回退一個事務的操做。
。事務恢復的須要。

[D]回退段操做舉例
。因爲語句錯誤回退一個事務。
。回退一個事務、或回退事務到一個保存點(SavePoint)。
。因爲異常進程中斷而回退。
。在例程恢復中回退全部未完成的事務。

// delete操做是最消耗回退段的操做

[E]回退段使用原則
。根據事務大小及數量肯定回退段。 // 每四個用戶至少對應一個回退段
。每一個事務必須對應一個回退段。
。一個事務能夠根據回退段中「最少使用原則」來自動對應一個回退段。
[C*]只有delete、insert、update三個命令使用回退段
// 回退段能夠自動動態擴展,但不能無限擴展。

/* 若是回退段都已經被用戶佔用,那麼再增長新用戶,則新用戶使用全部回退段中磁盤擴展量最小的回退段(與其它用戶共 享使用),這就是「最少使用原則」。所以,回退段能夠共享。
*/

。在建立數據庫後,應爲系統建立回退段,事務越多,回退段應越多。

三、區(Extents):區是磁盤空間分配最小單位。每個區的大小都是數據塊的整數倍(用戶能夠指定,默認是5倍)。

SQL> select segment_type, extent_id, bytes, blocks from user_extents where segment_name = 'EMP';
 
(1)區大小控制參數(磁盤存儲參數):
// 下面這五個參數對磁盤存儲有直接影響
Initial:初始區大小
Next: 增加區大小
Minextents:區的最小個數
Maxextents:區的最大個數
Pctincrease:區的增加百分比

SQL> Create table sales(
 s1 char(20),
 s2 char(20)
 Storage( initial 10K --// 第一個分區的大小
   next 10K  --// 第二個分區的大小
   minextents 1 --// 最少一個分區
   maxextents 121 --// 最多121個分區
   pctincrease 50); -- // 區的增加比例爲50%。
以上語句中的Storage部分,在建表時若是不寫是要隱含執行的。
1Block = 2K
第一個分區:Initial = 10K = 1Blocks * 5
第二個分區:Next = 10K
第三個分區= Next + next * 50% = 10K + 5K => 變成blocks的整數倍 = 16K
第四個分區 = 第三個分區 * ( 1 + 50%)
...

例:SQL> Create table sales(s1 char(20), s2 char(20)
  Storage(initial 100K next 200K minextents 2 maxextents 121 pctincrease 0);

/* 區過小,會致使區的數目太多,進一步致使磁盤碎片的產生。而區太大,則容易浪費空間。所以,要選擇合適的分區大小。最好的辦法是根據數據量的大小給表只分一個區。*/
估算分區的大小的方法:以上面例子中的表爲例:
(1) 1 行 = 40B
(2) 1block = 2048B , 2048B - 2048 * 20% - 標識= 1547
// 2048 * 20% 表示給一個塊兒留的剩餘空間,標識是用來存儲表中每行在塊中的位置的信息,其大小能夠經過查詢V$type_size來得到
(3) 1547 / 40 = A
(4) 假設表中可能有1百萬行的數據(最大數據量),則1000000/A*2K = B 兆。

則 initial 爲 B兆, 此時next值不要太大,由於initial區中已經分配了足夠的空間,假設是100M,那麼能夠把Next設置成1M。

(2) 區存儲參數能夠用於:表空間、表、段(回退段)、索引

(3) 存儲參數優先使用原則:
實體級參數> 表空間級對應參數> 系統缺省參數

實體級參數:指創建實體(如建表)時指定的存儲參數
表空間級對應參數:能夠從dba_tablespaces數據字典中查詢。

(4) 查詢實體的存儲參數:
SQL> select initial_extent, next_extent, min_extents, max_extents, pct_increase
 from user_tables
 where table_name = 'EMP';

[C* 有時SQL*Plus中查詢某個字段較多的表時,屏幕寬度不夠,而滾動條又不能橫向滾動,此時修改環境變量中的arraysize參數,將緩衝區寬度修改一下,默認是1000,能夠修改爲500,保存設置後便可使用橫向滾動條。]

(5)存儲參數的修改:
SQL> Alter table emp
 Storage (next 200k maxextents 2000 pctincrease 50); -- // 五個參數中只有這3個可以修改

四、數據塊(Blocks): 數據文件存儲空間單位,I/O最小單位。數據塊大小由參數db_block_size決定,數據庫建立後不得修改。
(1)查詢數據塊大小:
SQL> select value from v$parameter where name = 'db_block_size';

[2002.05.13]
//=====================================================================================================================
3、內存結構:
一、系統全局區SGA(System Glbal Area):共享的系統內存區域。SGA由三部分組成:數據緩衝區、日誌緩衝區、共享池。
(1) 數據緩衝區(Database Buffer Cache): 存儲由磁盤數據文件讀入的數據,全部用戶共享。數據緩衝區大小由參數db_block_buffers肯定。
 。數據緩衝區大小:db_block_buffers * db_block_size
 。參數文件位置:
 Windows NT: D:/oracle/admin/db_name/pfile/init.ora
 UNIX: /home/app/oracle/admin/db_name/pfile/initSID.ora
 
 // Dirty: 數據被修改而未寫盤。Pinned: 未修改的數據
 。LRU( Least Recently Used): 最近最少使用原則
 
(2) 日誌緩衝區(Log Buffer Cache): 存儲數據庫修改信息,由LGWR將日誌緩衝區數據寫入磁盤日誌文件組。
 。大小由參數log_buffer肯定
 
(3) 共享池(Shared Pool): SQL 緩衝區及數據字典區。對於SQL、PL/SQL程序進行語法分析、編譯的內存區域。
 。大小由參數SHARED_POOL_SIZE來肯定。(在參數文件中,單位爲字節)
 。分三部分:Libary cache, Data Dictionary cache, UGA(User Global Area)
 。
 
 [C*] SQL 語句執行計劃:
  Rule_Based: 基於規則,只考慮語句運行效率,不考慮成本。
  Cost_Based: 基於成本,考慮代價,硬件資源佔用小。
。SGA = db_block_buffers * db_block_size + log_buffer + shared_pool_size

[在實用狀況中,SGA固然是越大越好,但最大不要超過系統可用內存的55%~57%。]

。查詢SGA及數據參數取值:
SVRMGR> show sga
SVRMGR> show parameter
SVRMGR> show parameter db
SVRMGR> show parameter log
SVRMGR> show parameter 參數名稱

SQL> select * from v$sga;
SQL>select * from v$sgastat;

查詢數據庫名稱:SQL> select name from v$database;
查詢數據庫實例名稱:SQL> select instance_name from v$instance;

二、程序全局區PGA(Pragram Global Area): 非共享區域,主要是用戶編程時變量、數組工做區域。

三、排序區SORT AREA:用戶使用order by排序、彙總時臨時工做區域。排序區大小由參數SORT_AREA_SIZE肯定。

四、大區(Large Pool): 使用於數據備份工具Rman, 只用在Oracle8以上的版本數據庫,大區的大小由參數:Large_Pool_size肯定。

五、Java語言區(Java Pool): 用於Oracle 8i、Oracle9i中的Java語言。Java區的大小由參數Java_Pool_Size肯定。

4、Oracle 實例的進程結構:
一、什麼是Oracle實例?
  數據庫啓動時,系統分配SGA內存區域,同時啓動後臺進程,該SGA與後臺進程合稱爲一個Oracle實例(Instance)。
Instance ==> SGA + Background Processes

數據庫與實例相聯繫,有一個數據庫就有一個實例。實例名用參數instance_name表示,數據庫名用參數db_name表示。

 。數據庫實例名:
 instance_name (Oracle參數)
 ORACLE_SID(操做系統環境變量)
 在Unix系統中選擇數據庫實例:
 $ORACLE_SID=ora8i
 $export ORACLE_SID
 存取另外一個數據庫時:
 $ ORACLE_SID=ora835
 $ export ORACLE_SID
 $ svrmgrl
 在Windows NT/2000中選擇數據庫實例:
 c:/> set ORACLE_SID=ora8i
 C:/> svrmgrl
 C:/> set ORACLE_SID=ora835
 C:/> svrmgrl
 [*] 在Windows NT/2000中,數據庫實例名定義在註冊表中。
 
二、Oracle實例的進程結構:
 Oracle進程:單進程
    多進程==> 用戶進程、服務器進程、後臺進程。
 Dnnn(Dispatcher): 調度進程
 ARCH:歸檔進程
 PMON: 進程監控
 SMON: 系統監控
 CKPT: checkpoint
 RECO: Recovery
 
 [*] 進程數量的限制參數:Processes,Oracle數據庫進程數Processes < Unix 操做系統核心參數SEMMNS(這個參數指定Unix的最大進程數)。
 
 // 查詢後臺進程及說明
 SQL> select name, description from v$bgprocess;
(1) 用戶與服務器進程
 。用戶進程(User Precess)在用戶運行應用程序時自動產生。

[*] 數據存取方法:
a. 用戶發出查詢命令,產生user進程,server進程查找內存。
b. server 進程在內存沒有找到數據時,則server進程從數據文件中讀數據,則server進程在LRU找空閒塊。
c. 將LRU中的dirty塊--> Dirty List
d. Dirty List超長(threshold), 通知DBWR刷新緩衝區。
e. 從磁盤讀數據進入空閒內存。

(2) 後臺進程:
 [A]DBWR:數據寫入進程。該進程將數據緩衝區數據寫入磁盤數據文件,是進行數據緩衝區管理的後臺進程。
 
 設置DBWR進程數量參數:DB_WRITE_PROCESSES=1-10
 進程名稱依次爲:DBW0, DBW1, ... DBW9
 
 [B]LGWR:日誌寫入進程。將日誌緩衝區日誌信息寫入磁盤日誌文件組,在日誌切換時,再將日誌信息由歸檔進程ARCH寫入磁盤或磁帶,產生歸檔日誌。一個數據庫只有一個LGWR日誌寫入進程。
 
 [C]PMON(Process Monitor): 進程監控。在用戶進程中斷時,負責清理該用戶所佔用的硬件資源。
 
 [D]SMON(System Monitor):系統監控。負責清理用戶再也不使用的臨時段。
 
 [E]ARCH:歸檔進程。該進程在日誌切換時,負責將日誌信息寫到指定的磁盤存儲目錄,產生歸檔日誌,是與數據庫備份有關的一個後臺進程。在缺乏狀態下該進程不存在(由於oracle默認安裝狀態爲下日誌爲非歸檔方式)。
 [*] 與ARCH有關的數據庫參數:
 。啓動歸檔進程參數:log_archive_start=true (缺省爲false)
 。肯定歸檔日誌文件磁盤存儲目錄:log_archive_dest=目錄名
 log_archive_dest=/home/oracle/archive
 log_archive_dest=d:/oracle/archive
 。肯定歸檔文件存儲格式:log_archive_format=%t.%s.arc  
 /* %t:表示線程號 %s:表示日誌序列號,這樣文件不會同名。能夠不要%t, 擴展名本身給,也能夠不要擴展名。如%s.log。若是寫成%S(大寫的S),則文件名前面加零對齊。如123.log 會變成00123.log這種形式。*/
 
 。肯定歸檔日誌文件鏡象目錄:
 log_archive_duplex_dest=鏡像目錄名 (Oracle8以上)
 log_archive_duplex_dest=/home1/oracle/archive
 
 。Oracle8i啓用新的日誌文件存儲目錄:
 log_archive_dest_n = 'Location=目錄名'(Oracle8i以上) n<=5 // 在oracle9i,n <= 10
 
 log_archive_dest_1 = 'location=/home1/oracle/archive'
 log_archive_dest_2 = 'location=/home2/oracle/archive'
 ...
 log_archive_dest_5 = 'location=/home5/oracle/archive'
 
 [注意:]歸檔日誌存儲目錄要麼爲2個,即便用dest and duplex_dest這種方式,要麼爲5個,即便用dest_n這種方式,兩種方式不能混用。
 
 。失效參數(Oracle8i):
 log_archive_dest_state_n=DEFER(失效)
 log_archive_dest_state_n=ENABLE(生效)
 
 //使相應目錄失效:log_archive_dest_state_1 = DEFER
 [*]也能夠在線設置失效:SQL> alter system set log_archive_dest_state_1=defer;
 
 。啓動多個歸檔進程參數:log_archive_max_processes = 1~10  //要啓動幾個就寫幾
 歸檔進程名稱依次爲:ARCH0, ARCH1, ... ARCH9
 
 // 以上參數查詢請在svrmgrl中使用:show parameter log
 
 [SVRMGR> shutdown abort 是比shutdown immediate更有效的關閉數據庫的命令]
 
 [F] CKPT:檢驗點(Checkpoint)進程,用來同步各個數據文件。Checkpoint_Change#。
 
 a. checkpoint產生的六個條件[參考PowerPiont教程:dba_結構.ppt P61]。
 
 // DBA強制產生檢驗點:SQL> alter system checkpoint;
 
 b. 檢驗點的幾個參數
/* SVRMGR> show parameter checkpoint
NAME                                TYPE    VALUE
----------------------------------- ------- ------------------------------
log_checkpoint_interval             ??    10000
log_checkpoint_timeout              ??    1800
log_checkpoints_to_alert            ???  FALSE
*/

5、Oracle鏈接配置結構

三、多線程服務器體系結構MTS(Multithreaded Server)

SVRMGR> show parameter mts;

[第二章 數據庫啓動與關閉]

1、數據庫啓動:
Unix:
 login: oracle
 Password: xxxx
 $
 $ORACLE_HOME: /home/app/oracle/product/8.1.7
 $ svrmgrl
 SVRMGR>connect internal
 SVRMGR> startup
 SVRMGR> exit
 [*]啓動監聽進程:
 $lsnrctl start
 若是在啓動時報錯,檢查:/home/app/oracle/product/8.1.7/network/admin/listener.ora
 $lsnrctl stop  // 中止監聽進程
 $lsnrctl status  // 顯示監聽進程狀態
 
2、數據庫啓動過程:
一、啓動數據庫實例: ORACLE instance started
 。讀取參數文件
 。分配SGA區
 。啓動後臺進程
 // 若是啓動出現問題,有多是由於參數文件有問題或者內存不足。
二、數據庫安裝:Database mounted
 。讀取控制文件
 。打開控制文件
 // 若是啓動出現問題,多是控制文件出現問題。
三、打開數據庫:Database opened
 。打開所有數據文件
 。打開所有日誌文件
 // 若是有一個文件出現問題,則數據庫不能啓動。
 
數據庫文件讀取順序:參數文件 ==> 控制文件 ==> 日誌、數據文件,三類文件中不能有一個文件損壞,不然數據庫不能啓動。

四、數據庫啓動過程當中能夠使用的選項:

SVRMGR> startup OPEN --一、二、3 // 加OPEN與不加OPEN效果相同,一、二、3指三個步驟:啓動實例 ==> 安裝數據庫 ==> 打開數據庫
SVRMGR> startup MOUNT --一、2 啓動實例=> 安裝數據庫
SVRMGR> startup NOMOUNT -- 1  只啓動數據庫實例

(1) OPEN用於數據庫的正常啓動(或不加OPEN)。
(2) MOUNT的使用方式:
 。用於修改數據庫歸檔方式
 。用於數據庫恢復。Recovery命令在mount狀態使用。
在mount狀態,全部v$xxxx 數據字典能夠使用,全部alter database命令能夠使用。

(3) NOMOUNT的使用方式:
 。建立控制文件
 。建立新的數據庫
 
(4) 數據庫在MOUNT下能夠使用的選項:
SVRMGR> startup MOUNT
SVRMGR> Alter database ARCHIVELOG;  // 將數據庫由非歸檔方式修改成歸檔方式
[*] SVRMGR> Alter database NOARCHIVELOG; // 將數據庫由歸檔方式修改成非歸檔方式
// SVRMGR> archive log list
// SVRMGR> select log_mode from v$database;
SVRMGR> Alter database OPEN;   // 將數據庫由MOUNT直接到OPEN狀態。
SVRMGR> Alter database OPEN READ ONLY; // 整個數據庫以只讀方式打開
SVRMGR> Alter database OPEN READ WRITE; // 整個數據庫以讀寫方式打開(系統缺省方式,不須要寫上READ WRITE)

[2002.05.14]
//=====================================================================================================================

(5) 數據庫在OPEN下能夠使用的選項:
[A]
SVRMGR> startup PFILE=參數文件名稱及路徑

// 在有兩個數據庫存在的狀況下,能夠用以下方法同時啓動兩個數據庫。
SVRMGR> startup PFILE=第一個數據庫的參數文件名稱及路徑
SVRMGR> startup PFILE=第二個數據庫的參數文件名稱及路徑

[B]
SVRMGR> startup RESTRICT // 限制性數據庫啓動命令,以這種方式啓動數據庫後,具備restricted session權限的用戶能夠鏈接數據庫,其餘用戶不能鏈接。

DBA能夠指定用戶鏈接:
SQL> grant restricted session to scott;  // 指定權限
SQL> revoke restricted session from scott; // 收回權限

修改限制:
SQL> Alter system disable restricted session; // 解禁
SQL> alter system enable restricted session;  // 禁止

[C]
SVRMGR> startup FORCE // 強制性數據庫啓動命令

[D*] 容許多個選項同時使用,順序沒有關係:
SVRMGR> startup PFILE=c:/init.ora FORCE MOUNT
SVRMGR> startup force restrict pfile=c:/init.ora

3、數據庫關閉命令:
在關閉服務器以前,必須使用shutdown命令先關閉數據庫,再關閉操做系統。

SVRMGR> shutdown normal  // 正常關機。系統等待全部用戶從數據庫中正常退出,很難關掉。
SVRMGR> shutdown immediate // 當即關機。中斷如今鏈接,回退未提交事務,再也不接收用戶的鏈接請求。(有的用戶數據會丟失)
SVRMGR> shutdown abort  // 異常關機。只關閉實例,釋放內存,不保證數據完整性。儘可能少用。
SVRMGR> shutdown transactional // 事務終結後關機。等待用戶提交數據後關閉數據庫。

[補充內容]
4、數據庫啓動過程當中失敗恢復方法:

一、第一步不啓動(實例):參數文件錯誤:參數錯誤、路徑、文件名、參數設置錯誤等。

二、第二步不能mount:控制文件壞。檢查有沒有鏡像文件,若是沒有,須要從新建立控制文件。

三、第三步,數據庫不能Open。數據文件或日誌損壞。

(1) 數據文件(Datafile)被破壞或被誤刪除時數據庫的恢復方法。
SVRMGR> startup mount

[A]若是數據庫運行在ARCHIVELOG模式下,使用如下命令:
SVRMGR> alter database datafile '被刪數據文件名及路徑' OFFLINE;
// 在歸檔方式下,這個被刪的文件可能經過歸檔日誌恢復數據。

打開數據庫:SVRMGR> Alter database open;

[B]若是數據庫運行在NOARCHIVELOG模式下,使用如下命令:
SVRMGR> alter database datafile '被刪數據文件名及路徑' OFFLINE DROP;
// 在非歸檔方式下,被刪數據文件的內容絕對不可能恢復,因此只好DROP掉。

打開數據庫:SVRMGR> Alter database open;

(2) 日誌文件(Redo Log Files)被破壞或被誤刪除時數據庫的恢復方法。
SVRMGR> startup mount

刪除被物理破壞的日誌文件組:
SVRMGR> Alter database drop logfile group n;

增長已經被物理破壞的日誌文件組:
SVRMGR> Alter database add logfile group n('日誌成員文件', '日誌成員文件') size xxM;

SVRMGR> Alter database open;

// 若是當前日誌被破壞,則恢復操做將比較複雜,必須經過數據庫備份來恢復(不徹底恢復)。

四、從新建立控制文件(Control Files):
建立控制文件的語法:
SVRMGR> startup nomount
    Create controlfile database 數據庫名稱
    logifle
    group 1 (日誌文件名及路徑'', '日誌文件名及路徑') size xxM,
    group 2 (日誌文件名及路徑'', '日誌文件名及路徑') size xxM,
    ...
    noresetlogs
    datafile
    '第一個數據文件名稱及路徑' size xxM,  // xxM中不能出現小數點兒,若是有小數,就使用K,若是仍然有小數,則使用字節。
    '第二個數據文件名稱及路徑' size xxM,
    ...
    character set zhs16gbk;
   
SVRMGR> startup nomount
  Create controlfile database ora8i
  logfile
  group 1 ('d:/oracle/oradata/ora8i/redo01.dbf') size 1M,   
  group 2 ('d:/oracle/oradata/ora8i/redo02.dbf') size 1M,
  group 3 ('d:/oracle/oradata/ora8i/redo03.dbf') size 1M,
  noresetlogs
  datafile
  'd:/oracle/oradata/ora8i/system01.dbf' size 70M,
  'd:/oracle/oradata/ora8i/rbs01.dbf' size 520M,
  ...
  character set zhs16gbk;
 
 

SQL> select bytes/1024/1024, blocks, file_name from dba_data_files;
// 經過這個命令來查詢數據文件的大小,以Oracle中查詢的數據爲準,不要根據操做系統顯示的文件大小來決定,建議事先作好備份。

[*C] 修改數據庫名稱時,須要從新建立數據庫控制文件,語法以下(注意與上面的語法稍有不一樣):
SVRMGR> startup nomount
    Create controlfile set database 新數據庫名稱  // 這一行有不一樣,注意:數據庫的名稱通常不要超過5個字符。
    logifle
    group 1 (日誌文件名及路徑'', '日誌文件名及路徑') size xxM,
    group 2 (日誌文件名及路徑'', '日誌文件名及路徑') size xxM,
    ...
    resetlogs       // 這一行也有不一樣
    datafile
    '第一個數據文件名稱及路徑' size xxM,  // xxM中不能出現小數點兒,若是有小數,就使用K,若是仍然有小數,則使用字節。
    '第二個數據文件名稱及路徑' size xxM,
    ...
    character set zhs16gbk;
   
5、檢測數據庫文件工具:DBVerify

使用方法:
C:/> dbv file=文件名及路徑 logfile=輸出結果文件名 blocksize=數據塊大小(缺省是2K,不然指出) start=起始數據塊 end=終止數據塊

能夠檢測數據、日誌及控制文件等。若是不加start 和 end,則默認檢測整個數據文件。

[第三章 Oracle在Unix下安裝]

1、建立數據庫安裝用戶

*一、Oracle在Unix下運行平臺:
 。Sun Solaris(Sun SPARC)(Solaris是Oracle目前運行最多的平臺)
 。HP-UX
 。IBM-AIX
 。COMPAQ Tru64-Unix(ALPHA)
 。SCO UNIX(PC)
 。Linux(PC)
 。SGI
 // 前三種平臺上運行的最多

*二、用戶組名:dba(Oracle7, Oracle8)
  oinstall(Oracle8i, Oracle9i)

*三、在Unix下,與用戶所在組有關的文件:/etc/group
若是要加新組就在此文件中新加一行,如:
oinstall::20:oracle,oraweb
// gid < 1024,組號越大,權限越小。

*四、與用戶有關的文件:/etc/passwd
oracle8i:x:30:20:Oracle8i for Unix:/u01/app/oracle/product/8.1.7:/bin/sh
用戶名:x:用戶號:組號:描述(可省略):文件系統名稱:shell

//# admintool  Sun的圖形管理工具
//# sam   HP-UX
//# scoadmin  SCO UNIX

2、建立Oracle數據庫安裝目錄
在Unix下安裝數據庫,最好使用Oracle建議設置的標準目錄:
OFA(Optimal Flexible Architecture):將Oracle的系統文件與數據庫文件分別存儲。

OFA要求建立兩個目錄:
$ORACLE_BASE
$ORACLE_HOME

假設目錄爲:/u01/app/oracle/product/8.1.7
則:$ORACLE_BASE = /u01/app/oracle    // 這個目錄下的各個子目錄存放數據庫文件
$ORACLE_HOME = /u01/app/oracle/product/8.1.7  // 這個目錄存儲系統文件

例如:$ORACLE_BASE/oradata存儲數據文件

$df -k // 查看文件系統的使用率,若是超過80%,就不要再繼續添加文件,不然文件系統將十分慢

#mkdir app
# cd app
# mkdir oracle
...
# mkdir 8.1.7

# chgrp -R oinstall oracle //-R包括子目錄,將oracle目錄的屬組改成oinstall組
# chown -R oracle oracle  // 將oracle(第二個)目錄的屬主改成oracle用戶

# ls -al

3、編輯安裝用戶的.profile文件,定義操做系統環境變量

NLS_LANG,Oracle用戶在安裝時默認安裝爲與操做系統一致的字符集,所以要想在英文版本的操做系統上安裝支持中文的Oracle時,務必要設置這個環境變量。

#vi .profile // 內容以下:
ORACLE_BASE=/u01/app/oracle
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/8.1.7
export ORACLE_HOME
ORACLE_SID=ora8i  // 數據庫實例名
export ORACLE_SID
ORACLE_TERM=sun  //終端類型,SCO爲vt100,防止字符混亂
export ORACLE_TERM
NLS_LANG="simplified chinese"_china.zhs16gbk (oracle8.0之後)
       .zhs16cgb231280(oracle 8之前,爲保持數據兼容,如要導入oracle7的數據,建議選擇這一個)
export NLS_LANG
LD_LIBRARY_PATH=/usr/lib:$ORACLE_HOME/lib
export LD_LIBRARY_PATH
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export ORA_NLS33
TMPDIR=/var/tmp
export TMPDIR
PATH=/bin:$ORACLE_HOME/BIN:/usr/sbin;/opt/bin
export PATH

// .profile文件應該放在$ORACLE_HOME目錄下。

4、配置操做系統核心

5、安裝過程:
在安裝光盤下運行:$./runInstall


[第四章 建立Oracle數據庫、表空間管理、回退段管理]

1、建立數據庫
一、肯定數據庫名、實例名、服務名
數據庫名參數:db_name = prod
數據庫實例名參數:instance_name = prod
域名:db_domain
數據庫服務名參數:service_names = prod[.域名] //服務名等於:數據庫名.域名,爲了省事,通常不要域名。

二、建立新數據庫的參數文件:init.ora

須要修改的參數:
db_name
instance_name
service_names
control_files : d:/oracle/oradata/prod/... 01 02 03
background_dump_dest: 後臺信息跟蹤文件的存儲位置d:/oracle/oradata/prod/bdump
user_dump_dest: 用戶信息跟蹤文件的存儲位置d:/Oracle/oradata/prod/udump
sql_trace = true


三、設置操做系統參數:主要是設置ORACLE_SID選擇數據庫實例
在Unix下設置實例的方法:
$ORACLE_SID=ora8i
$export ORACLE_SID

換成另一個:
$ORACLE_SID=prod
$export ORACLE_SID


在Windows NT/2000下,有一個實例寫在註冊表中,若是要進入第二個數據庫,設置方法以下:
C:/> set ORACLE_SID=ora8i
C:/> set ORACLE_SID=prod

// 爲了避免致發生混亂,每次在使用數據庫以前,進行上述設置。

四、建立數據庫實例
語法:C:/>oradim -new -sid [實例名] -intpwd [口令] -startmode auto -pfile [數據庫參數文件名稱及路徑]

 。紅色部分須要用戶肯定
 。startmode: auto, manual
 。參數文件名稱及路徑:
 Unix:
  /u01/app/oracle/admin/db_name/pfile/initSID.ora
  /u01/app/oracle/product/8.1.7/dbs/initSID.ora // 這是oracle直接讀取的參數文件
 // 在Unix中上面的dbs目錄是pfile目錄的symbol link,即兩上文件是同一個文件。
 Windows:
  d:/oracle/admin/db_name/pfile/init.ora
  d:/oracle/ora81/database/initSID.ora   // 這是oracle直接讀取的參數文件
 /*第二個文件指向第一個文件,上面這個文件能夠隨便放到什麼位置,只要在第二個文件中經過IFILE指明瞭其位置,也能夠直接用第一個文件的內容替換第二個文件的內容。*/
 
[*] 刪除數據庫實例方法:
D:/> oradim -delete -sid [實例名]
 
最後的命令格式爲:
D:/> oradim -new -sid prod -intpwd prod -startmode auto -pfile d:/oracle/ora81/database/initprod.ora

[若是執行了set oracle_sid=prod後,仍然不能經過svrmgrl鏈接到internal用戶,請檢查是否在註冊表中設置了local串。]

五、建立數據庫:
SVRMGR> startup nomount
SVRMGR> create database prod
  logfile group 1('d:/oracle/oradata/prod/log1a.log',
     'd:/oracle/oradata/prod/log1b.log') size 2m,
      group 2('d:/oracle/oradata/prod/log2a.log',
     'd:/oracle/oradata/prod/log2b.log') size 2m
  datafile 'd:/oracle/oradata/prod system01.dbf' size 200m
   autoextend on next 10m maxsize 1000m
  character set zhs16gbk;

[2002.05.15]
//=====================================================================================================================
 
六、加載數據字典:
(1) 加載經常使用的數據字典:
SVRMGR>@d:/Oracle/ora81/rdbms/admin/catalog
SVRMGR>@/u01/app/oracle/product/8.1.7/rdbms/admin/catalog

(2) 加載PL/SQL程序包:
SVRMGR>@d:/Oracle/ora81/rdbms/admin/catproc

(3) 加載Java程序包:
SVRMGR> @d:/oracle/ora8i/javavm/install/initjvm

七、網絡配置:
配置tnsnames.ora文件
d:/oracle]ora81/network/admin/tnsnames.ora

八、以system登陸數據庫,加載資源文件profile:
SQL> @d:/oracle/ora81/sqlplus/admin/pupbld.sql

//若是不運行這個sql程序,普通用戶登陸時會提示錯誤。

[C*] 對於新數據庫,監聽程序不用配置,若是運行中出現沒有監聽,則運行:
D:/> lsnrctl status
查看相應的數據庫是否已啓動監聽。若是沒有啓動監聽,運行:
D:/> lsnrctl stop
D:/> lsnrctl start
重啓監聽程序。

若是在SQL*Plus中登陸數據庫時,提示service_name丟失,則重啓數據庫。

SQL> select name from v$database; //查詢當前數據庫

[C*]在Unix下:$dbassist

在Windows NT/2000下(oracle8i):
程序組-> Database administration-> Database Configration Assistant

能夠刪除已建立的數據庫(服務、文件)。

經過提示符下命令:oradim -delete -sid prod -srvc oracleserviceprod


SVRMGR> show parameter license   // 查看最大會話數,0表示沒有限制

共享服務器鏈接模式:
最大  缺省    說明
65534 254    最大數據庫文件數
254  32    最大日誌文件數
5  2    最大日誌成員數


2、表空間管理

SQL> select * from dba_free_space;  // 查詢表空間是否存在碎片

一、建立表空間
(1)語法:SQL> Create Tablespace tablespacename
   Datafile 'filespec' Attributes
   Default Storage
   Online/offline;


(2)實例:
SQL> Create tablespace sales_2002
 datafile
 'D:/oracle/oradata/ora8i/sales_2002_01.dbf' size 100m,
 'D:/Oracle/oradata/ora8i/sales_2002_02.dbf' size 100m
 autoextend on next 100m maxsize unlimited,   // 每一個文件均可以加上這一行,表空間的擴展屬性
 'D:/oracle/oradata/ora8i/sales_2002_03.dbf' size 100m
 default storage(initial 100k
     next 100k
     minextents 1
     maxextents unlimited
     pctincrease 0);
    
    
(3)查詢表空間與數據文件對應關係:
SQL> select tablespace_name, bytes, blocks, autoextensible, file_name from dba_data_files;

(4)建立臨時表空間:在建立表空間時增長臨時表空間關鍵字:temporary

SQL> Create tablespace temp_data datafile 'd:/oracle/oradata/ora8i/acc01.dbf' reuse
default storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0)
TEMPORARY;

說明:A.上例中的reuse指在相應的目錄已經存在一個acc01.dbf(大小已經肯定,例如一個被刪除的表空間,但物理文件未被刪除),則按這個文件的大小新建文件,內容將被覆蓋。若是文件不存在,須要使用size來肯定大小。

B. 臨時表空間用於排序,在建立用戶時能夠爲用戶指定專用的臨時表空間。臨時表空間不得用於建立永久性實體(例如表)。
SQL> create table aa(c1 number(10)) tablespace sales_2002;
SQL> create table bb(c1 number(10)) tablespace temp_data;


C. 查詢表空間類型:SQL> select tablespace_name, contents from dba_tablespaces;

二、改變表空間:

(1)爲表空間增長數據文件:
SQL> Alter tablespace sales_2002 ADD
 datafile
 'd:/oracle/oradata/ora8i/sales_2002_04.dbf' size 10m,
 'd:/oracle/oradata/ora8i/sales_2002_05.dbf' size 10m
 autoextend on next 50m maxsize 1000m;

(2) 將數據文件從一個磁盤移動到另外一個磁盤
 。將表空間脫機offline
  SQL> Alter tablespace sales_2002 offline;
 。物理移動:將要移動的表空間文件複製或移動到目的磁盤
 。邏輯移動
  SQL> alter tablespace sales_2002
   rename datafile
   'd:/oracle/oradata/ora8i/sales_2002_04.dbf',
   'd:/oracle/oradata/ora8i/sales_2002_05.dbf'
   to
   'c:/sales_2002_04.dbf',
   'c:/sales_2002.05.dbf';
 。將表空間聯機online
  SQL> alter tablespace sales_2002 online;
 
其中,system表空間數據文件不得移動。

(3) 修改表空間的缺省存儲參數

SQL> alter tablespace sales_2002
 default storage(
 initial 1m
 next 1m
 minextents 2
 maxextents 200
 pctincrease 50);
 
三、刪除表空間
SQL> Drop tablespace 表空間名;  // 空的表空間。
SQL> Drop tablespace 表空間名 INCLUDING CONTENTS;  // 若是表空間中已經建表,必須加Including contents參數。

刪除表空間後,再物理刪除相應的表空間文件,必定要確認是否刪除了正確的物理文件,在UNIX下,任何文件對root用戶來講都沒有保護措施,能夠隨便刪除。

3、Oracle8i啓用本地化管理(Locally Managed Tablespaces):
表空間類型:數據字典管理表空間,本地化管理表空間

本地化管理表空間自動消除磁盤碎片

SQL> create tablespace account datafile 'd:/oracle/oradata/ora8i/acc01.dbf' 10m
 default storage(initial 40k next 40k minextents 1 maxextents 121 pctincrease 0);
 
SQL> Alter database datafile 'd:/oracle/oradata/ora8i/acc01.dbf' resize 50m;

SQL> Alter tablespace account coalesce;  // 磁盤碎片合併命令。

一、區大小相同
SQL> Create tablespace account
 datafile 'd:/oracle/oradata/ora8i/acc01.dbf' size 10m,
 'd:/oracle/oradata/ora8i/acc02.dbf' size 10m
  extent management local uniform size 50k;
// extent management local: 區本地化管理;uniform:每一個區大小相同,若是不指定size,size默認是1m

對於實行本地化管理的數據文件仍然能夠使用autoextend on next, maxsize等參數。

查詢表空間類型及區管理方式:
SQL> select tablespace_name, extent_management, allocation_type from dba_tablespaces;

二、區大小由系統自動分配相同(系統缺省方式)
SQL> Create tablespace finance
 datafile
 'd:/oracle/oradata/ora8i/fina01.dbf' size 10m
 extent management local autoallocate;   // 缺省情況是autoallocate,若是隻寫extent management local。

<=等價=>
SQL> Create tablespace finance
 datafile
 'd:/oracle/oradata/ora8i/fina01.dbf' size 10m
 extent management local;
 
表大小  區大小
64K   64K
1m   1m
64m   8m
1000m  64m

三、建立本地化管理臨時表空間
SQL> Create temporary tablespace temp1
 tempfile
 'd:/oracle/oradata/ora8i/temp1_01.dbf' size 10m
 extent management local uniform size 10k;
 
[臨時表空間不得使用AutoAllocate選項,就算不寫uniform,默認也是uniform]
 
SQL> select tablespace_name, extent_management, allocation_type from dba_tablespaces;

[2002.05.16]
//=====================================================================================================================
4、回退段管理
一、建立回退段:rbs

[*]手動建立數據庫後,必須先建立回退段表空間:
SQL> create tablespace rbs
 datafile 'd:/oracle/oradata/ora8i/rbs01.dbf' size 50m;

[*]建立回退段:
SQL> Create rollback segment rs01
 tablespace rbs
 storage(initial 40k next 40k
 minextents 2      // 最少是2,不能是1
 maxextents 121
 optimal 120k);  // optimal值的大小至少比2個區的大小要大才有意義,在本例中要大於80K。
 
回退段的工做過程:(80K不夠用了)擴張->(使用結束)回縮到Optimal值 ->(120K不夠用了)再擴張。

新建回退段的缺省狀態是offline.

SQL> Create rollback segment rs02 tablespace rbs; // 若是不加storage參數,則各參數取缺省值(即表空間的相關值)

[*]查詢回退段信息:
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;

[*]回退段的設計方法:
A. 使用create rollback segment 建立多個回退段,至少四個事務平均一個回退段
B. 修改參數文件,將建立的回退段寫入下列參數:rollback_segments=(rs01,rs02,...)
C. 從新啓動數據庫

[*]建立公共回退段:
SQL> create public rollback segment rs10 tablespace rbs;


修改公共回退段,使公共回退段online:
SQL> alter rollback segment rs10 online;

公共回退段不須要修改參數文件便可online。

查詢:SQL> select segment_name, tablespace_name, status, owner from dba_rollback_segs;


二、修改回退段

SQL> Alter rollback segment 回退段名 online/offline; //對於私有回退段來講,只是臨時修改,下次數據庫啓動時,只有參數文件中的回退段是online


三、刪除回退段
A. offline
B. SQL> drop rollback segment 段名;
C. 若是是私有回退段,須要將其從參數文件中去掉。

// 不管是公共回退段仍是私有回退段,都是系統共用的回退段。即做用相同。

[第五章 Oracle 數據庫用戶管理]

// PowerPoint講義:DBA_用戶.PPT

1、建立用戶的Profile文件
SQL> create profile student limit  // student爲資源文件名
 FAILED_LOGIN_ATTEMPTS  3  //指定鎖定用戶的登陸失敗次數
 PASSWORD_LOCK_TIME 5  //指定用戶被鎖定天數
 PASSWORD_LIFE_TIME 30  //指定口令可用天數
 ...
 [參考講義:P6-P7]

2、建立用戶
SQL> Create User username
 Identified by password
 Default Tablespace tablespace
 Temporary Tablespace tablespace
 Profile profile
 Quota integer/unlimited on tablespace;

例:
SQL> Create user acc01
 identified by acc01   // 若是密碼是數字,請用雙引號括起來
 default tablespace account
 temporary tablespace temp
 profile default
 quota 50m on account;
SQL> grant connect, resource to acc01;

[*] 查詢用戶缺省表空間、臨時表空間
SQL> select username, default_tablespace, temporary_tablespace from dba_users;

[*] 查詢系統資源文件名:
SQL> select * from dba_profiles;
資源文件相似表,一旦建立就會保存在數據庫中。

/********************************************************************************************
SQL> select username, profile, default_tablespace, temporary_tablespace from dba_users;

SQL> create profile common limit
 failed_login_attempts 5
 idle_time 5;
 
SQL> Alter user acc01 profile common;

**********************************************************************************************/

3、修改用戶:
SQL> Alter User 用戶名
 Identified 口令
 Default Tablespace tablespace
 Temporary Tablespace tablespace
 Profile profile
 Quota integer/unlimited on tablespace;
 
一、修改口令字:
SQL>Alter user acc01 identified by "12345";

二、修改用戶缺省表空間:
SQL> Alter user acc01 default tablespace users;

三、修改用戶臨時表空間
SQL> Alter user acc01 temporary tablespace temp_data;

四、強制用戶修改口令字:
SQL> Alter user acc01 password expire;

五、將用戶加鎖
SQL> Alter user acc01 account lock;  // 加鎖
SQL> Alter user acc01 account unlock;  // 解鎖

4、刪除用戶
SQL>drop user 用戶名;  //用戶沒有建任何實體
SQL> drop user 用戶名 CASCADE;  // 將用戶及其所建實體所有刪除

*1. 當前正鏈接的用戶不得刪除。


5、監視用戶:
一、查詢用戶會話信息:
SQL> select username, sid, serial#, machine from v$session;

二、刪除用戶會話信息:
SQL> Alter system kill session 'sid, serial#';

三、查詢用戶SQL語句:
SQL> select user_name, sql_text from v$open_cursor;


/***************************************************************************************************************************
SQL> ALTER SESSION SET
 NLS_LANGUAGE= 'SIMPLIFIED CHINESE'
 NLS_TERRITORY= 'CHINA'
 NLS_CURRENCY= 'RMB'
 NLS_ISO_CURRENCY= 'CHINA'
 NLS_NUMERIC_CHARACTERS= '.,'
 NLS_CALENDAR= 'GREGORIAN'
 NLS_DATE_FORMAT= 'yyyy-mm-dd dy'
 NLS_DATE_LANGUAGE= 'SIMPLIFIED CHINESE' 
 NLS_SORT= 'BINARY'
 TIME_ZONE= '+08:00'
 NLS_DUAL_CURRENCY = 'RMB'
 NLS_TIME_FORMAT = 'HH.MI.SSXFF AM'
 NLS_TIMESTAMP_FORMAT = 'DD-MON-RR HH.MI.SSXFF AM'
 NLS_TIME_TZ_FORMAT = 'HH.MI.SSXFF AM TZH:TZM'
 NLS_TIMESTAMP_TZ_FORMAT = 'DD-MON-RR HH.MI.SSXFF AM TZH:TZM'
***************************************************************************************************************************/

[第六章 Oracle權限與角色管理]

1、Oracle 權限管理
SQL> grant connect, resource, dba to acc01;

SQL> revoke connect, resource from acc01;

2、Oracle 角色管理(參考講義)

SQL> Create Role <role_name>
 Identified by password/ Not Identified;
 
SQL> Alter Role <role_name> ...

SQL> Grant <privs> to <role_name>;

SQL> Grant <role_name> to <user_name>

SQL> Set Role <role_name>
 All Except <role_name2> / None  // 使角色生效或失效
 

[第七章 Oracle 數據庫備份與恢復]

1、Oracle歸檔方式

確認數據庫歸檔方式:

SVRMGR> archive log list;

SQL> select log_mode from v$database;


2、Oracle歸檔方式配置步驟:

一、啓動自動歸檔進程ARCH
 log_archive_start=true
 
二、肯定歸檔日誌文件存儲目錄
 log_archive_dest=目錄名

三、肯定歸檔日誌文件存儲格式
 log_archive_format=%t_%s.arc

四、肯定歸檔日誌文件鏡像目錄:
 log_archive_duplex_dest=鏡像目錄名

五、以MOUNT方式啓動數據庫,修改數據庫歸檔方式:
 SVRMGR> connect internal
 SVRMGR> startup mount
 SVRMGR> alter database archivelog;
 SVRMGR> alter database open;
 
// 前面一、二、三、4四個參數都在參數文件中。

[*]在Oracle8i之後,能夠使用多個鏡像目錄:[8i最可能是5個,9i是10個,與duplex方式不能混用]
log_archive_dest_1='location=d:/oracle/archive1'
log_archive_dest_2='location=d:/oracle/archive2'
log_archive_dest_3='location=d:/oracle/archive3'

[*]歸檔文件的格式爲二進制,能夠沒有後綴。

實際操做:
一、在d:/oracle目錄下創建archive1, archive2兩個目錄
二、修改init.ora文件,增長下面四行:
log_archive_start=true
log_archive_format=%t_%s.arc
log_archive_dest=d:/oracle/archive1
log_archive_duplex_dest=d:/oracle/archive2

三、進入svrmgrl
SVRMGR> connect internal/oracle
SVRMGR> shutdown immediate
SVRMGR> startup mount
SVRMGR> alter database archivelog;
SVRMGR> alter database open;

四、進入SQL*Plus
SQL> alter system switch logfile;

//檢查d:/oracle/archive1及archive2目錄下是否有歸檔的日誌文件。

[*]在線啓動或關閉歸檔方式
SQL> Alter system archive log start;
SQL> Alter system archive log stop;


3、數據庫物理備份
[*]爲了最大限度地進行恢復,應選擇最合理的備份方法來防止介質失敗致使的數據丟失。
(1)非歸檔的操做系統備份
(2)歸檔的操做系統備份
(3)Export工具有份
註釋:
。用歸檔的操做系統備份的方法來恢復到介質失敗後的失敗點。
。用其它的恢復方法恢復到介質失敗後的最後一次備份點。
。用Export工具建立一個直接的數據庫備份文件,它不能與歸檔log文件組合使用。


一、徹底數據庫脫機備份:能夠在歸檔及非歸檔兩種模式下使用。
操做步驟:
(1)編寫一個要備份的最新的文件列表。
(2)用SHUTDOWN命令關閉Oracle例程。
(3)用操做系統的備份工具,備份全部的數據文件、Redo Log文件、控制文件、參數文件。
(4)重啓Oracle例程。

二、部分數據庫聯機備份:
備份步驟以下:
(1) 確認數據庫運行在ARCHIVELOG下。
(2) 對於某一個表空間進行備份:
SQL> Alter tablespace 表空間名 begin backup;

(3) 操做系統備份相應數據文件

(4) 設置表空間備份結束標識:
SQL> Alter tablespace 表空間名 end backup;

恢復數據文件:
SVRMGR> Alter database RECOVER datafile '數據庫文件名及路徑';

<=等價=>

SVRMGR> RECOVER datafile '數據庫文件名及路徑';

三、部分數據庫脫機備份:
備份步驟以下:
(1) 確認數據庫運行在ARCHIVELOG下。
(2)將某一個表空間脫機:
SQL> Alter tablespace 表空間名 offline;

(3) 操做系統備份相應數據文件

(4) 將表空間聯機:
SQL> Alter tablespace 表空間名 online;

恢復時也須要進行恢復數據文件:
SVRMGR> Alter database RECOVER datafile '數據庫文件名及路徑';

<=等價=>

SVRMGR> RECOVER datafile '數據庫文件名及路徑';

4、徹底數據庫恢復應用實例
[*]徹底數據庫恢復的語法:
  在數據庫關閉時,數據庫恢復語法(能夠Mount):

SVRMGR> Alter database recover datafile 'filespec';
SVRMGR> Alter database recover database;
SVRMGR> Recover datafile 'filespec';
SVRMGR> recover database;

第一、3及第二、4條命令分別等價。

  在數據庫運行時,數據庫恢復語法(OPEN):
SVRMGR> recover tablespace 表空間名;
SVRMGR>recover datafile 'filespec';

一、數據庫文件被刪除,數據庫關閉時,數據庫恢復方法:
A、複製數據文件的備份文件
B、以mount方式啓動數據庫
C、恢復數據文件
SVRMGR> alter database recover datafile '數據文件名';
D、打開數據庫
SVRMGR> alter database open;

二、數據庫在運行時,數據文件被刪除的數據庫恢復方法:
A、將數據文件設置爲offline:
SVRMGR> alter database datafile '數據文件名' offline;

B、複製數據文件的備份文件
C、恢復數據文件
SVRMGR> alter database recover datafile '數據文件名';

D、將數據文件設置爲online:
SVRMGR> alter database datafile '數據文件名' online;


三、數據文件被刪除,該數據文件沒有備份,數據庫恢復方法:
A、以mount方式啓動數據庫
B、運行如下命令:
SVRMGR> Alter database create datafile '被刪除數據文件名及路徑'
    as '被刪除數據文件名及路徑';

C、恢復數據文件
SVRMGR> alter database recover datafile '數據文件名';

D、打開數據庫
SVRMGR> alter database open;

5、不徹底數據庫恢復實例:

一、恢復一個被Dropped的基表:
A、關閉數據庫
B、拷貝所有的數據文件(不拷貝日誌及控制文件)
注:這些拷貝的數據文件是之前作的數據文件的備份,如今拷貝回數據庫數據文件所在目錄,覆蓋掉原來的。固然,最好在覆蓋以前將如今的數據文件及歸檔日誌作好備份。

C、實施基於時間的不徹底數據庫恢復
SVRMGR> Alter database recover database until time '2002-05-17:9:00:00';
D、打開數據庫
SVRMGR> Alter database open RESETLOGS;
// 執行了resetlogs以後,文件同步號將從0開始,之前全部的歸檔日誌所有失效。

二、恢復一個被Dropped的表空間:
A、查詢跟蹤文件,肯定表空間刪除時間
D:/oracle/admin/db_name/bdump/sidAlrt.log

B、關閉數據庫,複製未刪除表空間前的所有數據文件及控制文件,不復制日誌文件。

C、實施基於時間的數據庫恢復:
SVRMGR> Alter database recover database until time '2002-05-17:9:00:00' using backup controlfile;

D、打開數據庫
SVRMGR> Alter database open RESETLOGS;

6、數據庫邏輯備份:(Export/Import)

一、exp user01/user01 file=user01  // 用戶方式:將user01用戶的全部數據導出到user01.dmp文件中
二、exp user01/user01 file=user01_table tables=(emp,dept, pay, ...)   // 表方式,將指定用戶的指定表導出。
三、exp    // 交互方式
四、卸出(導出)大表:
exp user/password file=filename direct=y  ...
// 加上direct=y,代表用直接路徑卸出數據,不經過內存,直接卸出到磁盤,效率高,節省內存。

四、所有數據庫卸出:
exp system/manager file=fulldb full=y direct=y

// 加上full=y,表示將整個數據庫所有卸出。

用戶方式和表方式能夠在NT 與 UNIX之間的Oracle進行數據傳輸,但整個數據庫方式不能,由於包含了相關的數據文件信息。


7、卸出表空間:
一、檢驗表空間自包含性:檢查表空間是否是與其它表空間有外鍵約束,有外鍵約束的不能卸出。
SQL> execute ...

二、將表空間設爲只讀

三、使用export卸出表空間
exp transport_tablespace=y tablespaces=mis file=expdat.dmp

四、使用Import裝入表空間
imp transport_tablespace=y datafile='d:/oracle/oradata/x.dbf' tablespaces=mis file=expdat.dmp


8、Windows 計劃任務備份數據文件
一、C:/> net start schedule //啓動計劃服務
    net stop schedule //中止計劃服務
   
二、AT命令安排計劃:
C:/>at 22:00 /every:m,t,w,th, f, s, su d:/fullback.bat // 每週一到週日的晚上十點運行d:/fullback.bat批處理文件

C:/>at /delete /yes  // 刪除所有計劃

三、fullback.bat
svrmgrl @d:/fullback.sql

四、fullback.sql
connect internal/oracle
shutdown immediate
host copy d:/oracle/oradata/ora8i/*.* e:/back
startup


還能夠爲數據庫在線備份創建腳本經過AT調用執行,實現數據庫的聯機備份。


[第八章 Oracle 數據庫的優化與調整]

1、下面三個參數屬於SGA區的設置,主要看服務器內存是否是須要擴充。

一、數據緩衝區計算:(DB_BLOCK_BUFFERS)

SQL> select 1 - (phy.value /(blk.value+con.value))
 "   Hit Ratio"
 from v$sysstat phy, v$sysstat blk, v$sysstat con
 where phy.name = 'physical reads' and
   blk.name = 'db block gets' and
   con.name = 'consistent gets'
  
Hit Ratio最好是大於90%,須要在數據庫在最繁忙的時候的命中率,不然須要增長內存。


二、日誌緩衝區計算(log_buffer)
v$latch

sum(misses) 越接近於零越好。

三、共享池大小計算(shared_pool_size)
(1) v$librarycach:  PINS(命中),Reloads(失敗)

Reloads/(pins + reloads) * 100 -> 失敗率 -> 應小於1%,不然須要擴內存。

(2) v$rowcache: GETS(取到),  GETMISSES(失敗)


2、排序區參數計算(SORT_AREA_SIZE):v$sysstat

sorts(disk) / sorts(memory)+sorts(disk)  失敗率 < 10%

3、磁盤存儲參數測算:
計算如下存儲參數:
initial
next
minextents
maxextents
pctincrease

若是使用本地化管理,不須要計算以上參數。

4、數據庫參數自動統計計算
一、修改參數文件:timed_statistics=true,重啓數據庫

二、在數據庫最繁忙的時段運行下面兩個SQL程序(在Oracle目錄中搜索這兩個文件)

SVRMGR>@d:/oracle/ora81/rdbms/admin/utlbstat.sql   
SVRMGR>@d:/oracle/ora81/rdbms/admin/utlestat.sql

三、查詢d:/report.txt來看統計結果。

5、回退段優化設計
一、對於大事務,設計大回退段,提升數據操做速度。

步驟以下:
A、建立一個專用的回退段表空間。例如:rb100
B、在回退段表空間rbs100上建立大的回退段。
SQL> create rollback segment rbs100
 tablespace rbs100
 storage(initial 50m);
C、使回退段表空間online
SQL> Alter rollback segment rbs100 online;

D、指定用戶使用專用的回退段表空間:
SQL> set transaction use rollback segment rbs100;  // 必須在事務開始前指定

E、事務結束後,刪除回退段及表空間。


教師操做實例:
System用戶操做:
SQL> create tablespace rbs1 datafile 'd:/oracle/oradata/ora8i/rbs1_01.dbf' size 10m

SQL> create rollback segment rbs100 tablespace rbs1;

SQL> alter rollback segment rbs100 online;

SCOTT用戶操做:
CREATE table bb(s1 char(20));

insert into bb values('abcdefghi');

commit;   // 必須在事務開始以前設置回退段

set transaction use rollback segment rbs100;


system用戶操做:

alter rollback segment rbs100 offline;

drop rollback segment rbs100

drop tablespace rbs1;

二、回退段I/O調整,具體步驟:
A、建立多個回退段表空間,對就不一樣物理磁盤,以平衡磁盤I/O
B、在多個表空間上分別建立回退段。例如:
rbs1:rbs01, rbs02, rbs03, rbs04, rbs05
rbs2: rbs06, rbs07, rbs08, rbs09, rbs10

C、修改參數文件,使回退段交叉排放。例如:
rollback_segments=(rbs01,rbs06,rbs02,rbs07,rbs03,rbs08,...)


[Oracle Developer/2000 系統開發工具]

簡介:
Form: 開發基於Form應用系統,是Developer/2000的主要開發工具。
Report: 報表開發工具,開發設計各類報表。
Graphics:圖形設計工具,開發基於數據庫的圖形界面

Form 包括如下三個工具:
。Form Builder 設計與開發組件
。Form compiler 編譯組件
。Form Runtime 運行組件

[Form Builder 設計]

1、建立一個簡單的Form應用

表在Form Builder中稱爲數據塊。

在新建的Form中的表格字段中能夠輸入查詢條件,按F8按條件查詢。

另 外,能夠在字段中輸入變量,例如:在emp表中的sal(工資)字段輸入變量:x,在執行查詢時,輸入:x> 2000 and :x < 3000,則表示查詢工資在2000及3000之間的人員。若是要查詢1981年的人員,則在date字段輸入:x,條件爲:To_Char(:x, 'yyyy) = '1981'

查詢最大工資::x = (select max(sal) from emp)

2、建立主從型Form應用:
一、使用主表建立主塊
二、使用子表建立子塊
三、創建主表與子表之間的關聯

3、佈局設計(Layout)

4、域屬性表(Properties): 雙擊某字段便可調出屬性表

格式掩碼

5、建立文本項(Text Item):

文本項:用於顯示數據庫的統計結果

名稱
數據類型
格式掩碼
計算模式
彙總函數:總和
數據塊:emp
數據項:fullsal


公式:水平計算
彙總:垂直計算

工資及獎金合計::sal + nvl(:comm,0)

數據->用項同步化

記錄->顯示的項數:0 -> 1

6、建立值列表Lov(List of Value):

7、建立按鈕(Push Button):

一、建立文本類型按鈕:
數據查詢,條件查詢,工資總和,報表打印、退出系統
二、建立圖標類型按鈕:
(1)經常使用缺省圖標:
save:數據提交
rt_rdel:數據刪除
rt_radd: 數據插入
rt_rec4: >>
rt_rec3: >
rt_rec2: <
rt_rec1: <<

(2)更改按鈕屬性
圖標化:是
圖標文件名:<Icon File path>
鼠標導航:否
顯示的項數:1

(3) 增長按鈕提示
保存
刪除
插入數據
第一條記錄
下一條記錄
上一條記錄
最後一條記錄


8、建立顯示項(Display Item):
顯示項:只讀數據項,用於顯示數據庫的統計結果。


9、建立單選按鈕(Radio Button):

(1) 增長了單選按鈕後,先到「對象導航器」中修改「Radio Group」的屬性

名稱:
鼠標導航:否
數據類型:數值
初始值:10


財務部(10)、銷售部(20)、開發部(30)、網絡中心(40)

示// 數據->須要:若是選擇「是」,則代表數據爲非空,不容許爲空,若是不在表中輸入查詢條件,則不容許移動光標焦點,應選「否」。

10、複選框(Check Box)

增長一個複選框,修改其屬性:
名稱:
標籤文本:
複選時的值:y
未複選時的值:n
鼠標導航:否
顯示的項數:1
數據庫項:否

[Trigger 觸發器設計]
1、按鈕觸發器設計:
觸發器類型:WEHN-BUTTON-PRESSED
觸發器代碼:使用PL/SQL及函數編寫程序代碼。

Execute_Query;   // 執行查詢的函數,這是寫在相應按鈕上的PL/SQL執行語句的腳本

編譯,關閉,執行。


Enter_Query; // 條件查詢函數

Exit_Form; // 退出系統函數

經常使用的對於數據庫操做的函數:
Create_Record;  // 數據插入
Delete_Record;  // 數據刪除
Commit_Form;  // 數據提交
Execute_Query;  // 無條件數據查詢
Enter_Query;  // 條件查詢
Next_Record;  // 下一條記錄
Previous_Record;  // 上一條記錄
First_Record;  // 第一條記錄
Last_Record;  // 最後一條記錄
Scroll_Up;  // 上滾一屏
Scroll_Down;  // 下滾一屏
Exit_Form;  // 退出系統

這些函數名不區分大小寫。

若是在執行查詢時提示Oracle錯誤,不能查詢,有可能就是由於Form中一個與數據庫字段無關的對象的「數據庫項」設置成了「是」,將其改爲「否」便可。

工資總和按鈕的WHEN-BUTTON-Pressed的pl/sql腳本:select sum(sal) into :Display_sumsal from emp;


2、建立Form級觸發器完成數據庫的自動查詢與統計:
A. 在Form啓動時,進行自動查詢

觸發器名稱:WHEN-NEW-FROM-INSTANCE
對象導航器->表格->Form1->觸發器->新增

腳本內容:Execute_Query;


B. 在Form啓動時,進行自動統計計算

觸發器名稱:POST-QUERY
對象導航器->表格->Form1->觸發器->新增
select sum(sal) into :Display_sumsal from emp;

C. 顯示動態時間:
觸發器名稱:POST-QUERY
自動顯示統計時間:yyyy年mm月DD日
增長一個顯示項:DISPLAYTIME
數據類型:字符
立體:無

修改POST-QUERYR的腳本,增長一行:
:DISPLAYTIME := To_Char(sysdate, 'yyyy"年"mm"月"dd"日"');  --// 顯示的是客戶端時間

select To_Char(sysdate, 'yyyy"年"mm"月"dd"日"') into :DISPLAYTIME from dual; --// 顯示的是服務器端時間

[C*]在編輯觸發器腳本中漢字不能正確顯示的解決辦法:
先退出FormBuilder。而後:
regedit -> HKLM-> Software -> Oracle -> 新建字串de20_plain_edit,鍵值爲1。
再從新進入FormBuilder便可解決全部的漢字顯示問題。

D. Form啓動時,MDI窗口最大化及標題設置,一樣在FORM的POST-QUERY觸發器中設置:
SET_Window_Property(FORMS_MDI_WINDOW, WINDOW_STATE, maximize);
Set_Window_property(FORMS_MDI_WINDOW, TITLE, '公司員工工資狀況一覽表');

設置MDI子窗口Window1:
SET_Window_Property('window1', WINDOW_STATE, maximize);
Set_Window_property('window1', TITLE, '員工管理信息系統 Version 200205 Build 1');


[*] 進入Form1模塊的屬性設置-> 菜單模塊 -> default&smartbar ,default表示菜單,smartbar表示工具欄,去掉就表示沒有這些東西。

[*] Window1屬性-> 模式 -> 是。意味着這是mdi窗口中的最後一個窗口。還能夠取消最大最小化等按鈕,實現mdi子窗口看上去與主窗口好象一個窗口。

3、單選按鈕觸發器:
觸發器類型:WHEN-RADIO-CHANGED
腳本:
Declare
 string varchar2(50);
 v_dname dept.dname%type;
Begin
 select sum(sal), count(*) into :Display_item2, :Display_item3 from emp
  where deptno=:select_deptno;
 select dname into v_dname from dept where deptno = :select_deptno;
 string := v_dname || '部門統計結果';
 Message(string);

Exception
 when NO_DATA_FOUND THEN
  Message('數據庫中沒有編碼爲'||:select_deptno||'的部門。');
End;

4、時間觸發器(Timer):
一、建立計時器,肯定時間間隔:
觸發器名稱:WHEN-NEW-FORM-INSTANCE
增長腳本:
Declare
 timer_id timer;
Begin
 timer_id := Create_Timer('T1', 1000, REPEAT);
End;
-- T1:計時器名稱(大寫);1000:時間間隔(毫秒);REPEAT:重複

二、建立時間觸發器的執行操做:
觸發器名稱:WHEN-TIMER-EXPIRED
Declare
 t_name varchar2(30);
Begin
 t_name := Get_Application_Property(TIMER_NAME);
 if t_name = 'T1' then Begin
  --顯示Server時間
    select To_Char(Sysdate,'yyyy"年"mm"月"dd"日"hh24"時"mi"分"ss"秒"')
     into :DisplayTime from dual;
     --顯示本機時間
   :DisplayTime :=To_Char(Sysdate,'yyyy"年"mm"月"dd"日"hh24"時"mi"分"ss"秒"') ;

  --select To_Char(sysdate, 'yyyy"年"mm"月"dd"日"hh24"時"mi"分"ss"秒") into :DisplayTime from dual;
  End;
 End if;
End;

5、複選按鈕觸發器:
觸發器類型:WHEN-CHECKBOX-CHANGED
腳本:
Begin
 if :ifprint='y' then
  Set_Item_Property('print_report', ENABLED, PROPERTY_TRUE);  --// 使打印按鈕生效
 ELSE
  Set_Item_Property('print_report', ENABLED, PROPERTY_FALSE);  --// 使打印按鈕無效
 end if;
end;

6、菜單設計
在 c:/orawin95目錄下查找menudef.mmb,而後打開該文件,雙擊MENUDEF編輯原來的菜單(刪除不要的,添加須要的),而後另存爲自 己的菜單menu1.mmb,而後編譯(文件->管理->編譯文件CTRL+T)。。而後在Form1的屬性設置中,將菜單模塊直接設置成菜單文件的名稱 及路徑,例如:e:/xyf/menu1

7、基於數據庫的圖象字段存儲:
一、在數據庫中建立一個含有圖象字段的基表。
SQL>Create table employee as select * from emp;
SQL> alter table employee add(photo long raw);  --//加上long raw字段後,該表就不能再用select * 去查詢

二、對圖象文件進行惟一性編碼

SQL> Spool e:/empno
SQL> select empno from emp;
SQL> Spool off;

生成e:/empno.lst文件,存儲了全部僱員的empno列表做爲圖象文件的惟一性編碼
如:7788.jpg...

三、建立Form,編寫觸發器調用圖象文件:photo.fmb
photo屬性->大小風格 -> 調整

empno字段的觸發器:WHEN-NEW-ITEM-INSTANCE
Declare
 photo_name varchar2(50);
Begin
 photo_name := 'e:/xyf/'||To_Char(:empno)||'.jpg';
 Read_Image_File(photo_name, 'jpg', 'photo');
End;

四、圖象數據提交數據庫。

五、刪除本機圖象,刪除觸發器。

8、標籤畫布(Page):
不使用數據塊嚮導,直接在「表格」處新增一個Form,而後進入佈局編輯器,選擇左邊工具欄中的「標籤畫布」新建一個標籤畫布。而後回到對象導航器,刪除原來的畫布。

在佈局編輯器中,在標籤位置按鼠標右鍵->屬性選項板,能夠進入標籤畫布的根的屬性設置中,而在某個標籤的中間部位按鼠標右鍵->屬性選項板,則能夠進入這個標籤頁的屬性設置。

對象(導航器) -> 數據塊 -> 關係 -> 新建:dept.deptno = employee.deptno

各個標籤頁的顯示順序,由在各個頁上的數據塊在對象導航器中的排列前後順序肯定,能夠經過鼠標拖動來直接調整其排列順序。


[Oracle Application Server應用服務器]
試驗環境:
Oracle Server:
IP: 75.64.23.30
SID: orcl

Oracle Application Server:
IP: 75.64.23.40
Host Name: ntsvr1

用戶:
user01/user01, ... user40/user40

1、WWW原理簡介

URL: Uniform Resource Locator
HTTP: Hyper Text Transfrer Protocol
HTML: Hyper Text Markup Language

2、Oracle Application Server概述


3、Oracle Application Server 服務器啓動
在操做系統下命令啓動:
$ owsctl start   // 啓動OAS服務器
$ owsctl start -nodemgr // 啓動OAS管理節點

管理節點:
IP: 75.64.23.40:8888  //管理節點的端口號爲8888
管理員用戶:Admin

4、Oracle Application Server 原理簡介
http://www.oracle.com:80/news.html     // 靜態頁面
http://www.oracle.com:121/cgi/plsql/p_query.go  // 動態頁面

5、Oracle Application Server 配置步驟:
一、加載PL/SQL 程序包(經過IE登陸到OAS的遠程管理節點):

http://ntsvr1:8888/  (配置方法:在c:/windows目錄下創建文本文件hosts,內容爲:75.64.23.40 ntsvr1)

OAS實用程序-> 安裝 -> PL/SQL工具包 -> 數據庫鏈接串 -> sys用戶口令 -> 應用。

若是OAS與Oracle服務器在一臺機器上,則使用Oracle_SID,不然要使用鏈接串。

二、建立HTTP監聽進程
在建立HTTP監聽進程時,須要肯定的信息:
監聽進程的名稱
端口號:(1 - 16653 之間)
主機名稱:

三、建立DAD(Data Access Description)數據存取描述器,創建OAS與數據庫之間的鏈接
Oracle Application Server => DB存取描述

須要肯定的信息:
。名稱:
。合法的數據庫用戶名及口令
。數據庫位置:
。網絡鏈接串名

四、建立應用:

選擇應用程序所使用的語言:PL/SQL
應用程序名:mis01

應用的狀態標誌通常爲紅旗,沒有關係。

五、建立插件。肯定信息以下:
。插件名稱:mis01
。顯示名稱: 人員工資信息
。虛擬路徑:/cgi/plsql  //這裏怎麼設置,用戶在輸入時就要怎樣輸入URL
。物理路徑: %ORAWEB_HOME%/bin
。所鏈接的數據庫信息:經過DAD肯定(下拉菜單選擇)

用戶輸入URL範例:http://75.64.23.40:1234/cgi/plsql/p_test


[***]全部配置結束後,從新加載OAS。


6、使用PL/SQL開始Web頁面

一、標記函數:
htp.htmlOpen   <HTML>
htp.htmlClose </HTML>
htp.headOpen <HEAD>
htp.headClose </HEAD>
htp.bodyOpen    <BODY>
htp.bodyClose   </BODY>
htp.comment      <!--    -->

二、PL/SQL過程、函數、包:
owa_cookie
owa_image
owa_util
owa_opt_lock
owa_pattern
owa_sec
owa_text


三、
HTML:
<html>
<head>
<title>歡迎使用Oracle Application Server</title>
</head>
<body><p>
<strong>歡迎使用Oracle Application Server!</strong></p>
</body>
</html>

對應的PL/SQL程序:
Create or Replace Procedure P_ShowExample  AS
       BEGIN
         htp.htmlopen;
         htp.headopen;
         htp.title('Oracle Application Server 4.0!');
         htp.headclose;
         htp.bodyopen;
         htp.strong('歡迎使用Oracle Application Server!');
         htp.bodyclose;
         htp.htmlclose;
       END;

在SQL*Plus中運行上面的程序建立相應的存儲過程。


四、顯示數據庫中基表的數據:P_TEST.sql
Create or Replace Procedure P_Test  AS
           ignore boolean;
              BEGIN
                     htp.htmlopen;
                     htp.headopen;
             --      htp.title('Display the Current Users in Oracle Database!');
                     htp.headclose;
                     htp.bodyopen;
                     htp.header(1, '  輸出數據庫基表中數據');
                     ignore := owa_util.tableprint('emp','BORDER',owa_util.html_table);
                     htp.bodyclose;
                     htp.htmlclose;
              END;
             
五、動態數據基表名稱:P_query.sql
運行方法:http://75.64.23.40:1234/cgi/plsql/p_query.go

六、webalchy.exe: //能夠將標準的html文件轉換成PL/SQL程序。       


七、使用列表項,選擇部門編碼:P_Select.sql
http://75.64.23.40:1234/cgi/plsql/p_select.go

[C*] owa_util.TablePrint函數用法
owa_util.tablePrint(c1,c2,c3,c4,c5,c6,c7,c8)

其中:
c1: 表名。例如:'emp'
c2: 是否有表格線。'BORDER'
C3: 表格的格式。owa_util.html_table
c4: 基表中的列名。缺省爲'*',即全部列
c5: where語句:例如:'where deptno = '||v_deptno||' or sal > '||v_sal|| 'order by sal',
c6: 列名的別名
c7: 最少顯示多少行,0(所有顯示)
c8: 最大顯示多少行,缺省爲NULL。

八、輸入員工編碼,顯示員工信息:P_empno.sql

九、多個選擇項:列表項及文本框輸入:P_Mselect.sql

十、使用無線組(Radio Group) 顯示部門信息:P_rselect.sql

十一、向數據庫中錄入員工信息:P_input.sql


[Report Builder 報表設計]
1、建立一個簡單的報表:
Report Builder -> 工具 -> 報表編輯器 -> 新建查詢

而後佈局嚮導建立佈局。

預覽界面->點左上角圖標 -> 數據模型 -> 再點左上角圖標 -> 預覽界面

2、建立分組報表
在數據模型界面拖動要分組的列到列外便可建立分組。

一、增長公式列(水平方向計算):
數據模型->左邊工具欄中公式計算圖標。
return :sal + nvl(:comm,0);

二、增長彙總列(垂直方向計算):

每次有新列(域)增長後,都要在數據模型主窗口->鼠標右鍵->報表嚮導中進行適當的修改。

3、佈局設計(Layout)
一、報表嚮導->標籤:修改標籤爲中文

二、視圖->佈局模型
編輯->選擇所有
左邊工具欄->添充顏色,格式->字體

頁邊距:至關於頁眉,頂部工具欄中按鈕。

在增長文本框時,若是默認字體不是中文,請先在格式->字體中設置爲中文字體,而後再輸入。

雙擊域能夠設置字段屬性。

4、建立主從型報表:使用主從型 藏青建立主從型報表

一、在對象導航器->報表->新建->手動,進入數據模型窗口。

二、SQL:
(1)select * from dept
(2) select * from emp

(3)點擊左邊縱向工具欄中「數據連接」:從dept.deptno 拖動到emp.deptno1放開,創建數據連接。

(4)報表嚮導
 。風格:上邊分組。
 。組:兩個組均是縱向
 。域:除了重複的deptno1以外都要
 。模板:無模板。

三、在佈局模型中調整表格結構


5、建立矩陣報表:
一、構造矩陣報表至少須要四個組:
一個橫向顯示數據的組
一個縱向顯示數據的組
一個在交叉點顯示數據的組
一個矩陣單元組

二、操做步驟:

(1)手動建立一個報表。

(2) SQL1:select deptno, job, sum(sal) from emp group by deptno,job;  

(3) 將deptno和job拖出成爲兩個分組的條件。

(4) 點擊左方工具欄交叉單元按鈕,將G_2.DEPTNO 與 G_3.job括起來,這樣成爲一個G_4交叉組。

(5) 報表嚮導
風格:矩陣
單元:sum_sal
總計:總和(sum_sal)
模板:無

(6) 佈局模型從新佈局。


6、分組矩陣報表:

(1)手動建立一個報表。

(2) SQL1:select To_Char(hiredate, 'yyyy') year, deptno, job, sum(sal) from emp group by To_Char(hiredate,'yyyy'), deptno, job;

Q_emp, G1

(3) 將Year,deptno和job拖出成爲三個分組的條件。G_year, G_deptno, G_sulsal, G_job, G_cross

(4) 點擊左方工具欄交叉單元按鈕,將G_3.DEPTNO 與 G_4.job括起來,這樣成爲一個G_5交叉組。

(5) 報表嚮導
風格:分組矩陣


[Graphics Builder 圖表設計]
1、建立餅圖(Pie):
一、打開Graphics Builder,鏈接數據庫。
菜單:圖表->建立圖表

二、輸入SQL語句肯定數據源:select deptno, sum(sal) from emp group by deptno; -> 執行 ->肯定

三、圖表:餅圖,名稱:Pie

四、菜單:圖表->框架->餅框架->顯示數據值,顯示百分比值

能夠修改所顯示數據值的字體、顏色等。能夠修改餅圖的框架、側面及陰影的填充顏色等。

2、建立列圖(Column):

1. SQL: select ename, sal from emp

2. 名稱:column

圖表框架: 深度尺寸,陰影尺寸,陰影方向。顯示繪圖框架(選中),顯示圖例(去掉)。

側面、頂部、陰影的填充顏色,不要修改正面的填充顏色。

雙擊兩個座標軸能夠設置座標軸屬性,去掉「顯示座標軸標籤」

3. 畫一個矩形將圖表括起來,填充顏色而後置後,給圖表加上標題。


3、建立主從型圖表(Drill-Down):
一、建立主圖:pie
select deptno, sum(sal) from emp group by deptno

二、建立參數
導航器-> 參數 -> 新增
名稱:n
類型:數字
初始值: 10
三、使用參數建立子圖
新建圖表-> 新建查詢 -> select ename, sal from emp where deptno=:n; // 將參數n放入第二個查詢中。
子圖名:column

四、創建兩個圖表之間的關係
選餅圖中心雙擊->對象屬性->細化:
設置參數:N
對於值:DEPTNO
執行查詢:query1(新建的子查詢)

五、運行


4、圖表切割:
選餅圖中心雙擊->對象屬性

過程->編輯

rrow number;

chart og_object;

BEGIN
 chart := Og_Get_Object('pie'); // 將名爲pie的圖表放到chart變量中。
 rrow := Og_Get_Row(HITOBJ);
 Og_Set_Explosion(chart, rrow, 'deptno', 50);  // 切割的距離爲50個小數點
 Og_update_Chart(Chart, OG_ALL_CHUPDA);
End;


[Developer/2000集成]
1、Form調用Report:
一、建立一個含有參數的報表:r11
二、在Form中調用Report:(Form之前面創建的Form1 (Form3)爲例)。

報表打印按鈕的WHEN-BUTTON-PRESSED腳本:
Declare
 pl_id paramlist;
Begin
 pl_id := Create_Parameter_List('tmpdata');
 Add_Parameter(pl_id, 'dno', TEXT_PARAMETER, To_Char(:deptno));
 Add_Parameter(pl_id,'paramform',TEXT_PARAMETER,'no');
   Run_Product(REPORTS,'e:/xyf/r11.rdf',
    ASYNCHRONOUS,RUNTIME,FILESYSTEM,pl_id,null);
   Destroy_Parameter_List(pl_id);
End;

2、Form 調用Graphics:
一、建立一個含有參數的圖表
select ename, sal from emp where deptno = :dpt;

二、在Form中建立圖表項
三、編寫觸發器調用圖表

訪問表空間權限控制:
去掉用戶對某個表空間的訪問權限
ALTER USER ZYIBSS QUOTA 0 ON IBMS_DATA_DATA;
ALTER USER ZYIBSS QUOTA 0 ON IBMS_DATA_IDX;

增長用戶對某個表空間的訪問權限
ALTER USER ZYIBSS QUOTA UNLIMITED ON IBMS_DF_DATA;

移動表空間:
alter table tcm-user move tablespace  ibms-data-data


append是優化提示器,這個最好不用,你能夠用並行提供來作
insert /*+parallel(emp,2) */ into emp nologging 2是表明什麼啊?
2是用2個CPU來併發作事
這個有什麼好處,能夠加快速度?仍是 ?

能允分利用多處理器的好處嘍
會明顯變快的
看你的主機是多少CPU的了,我最多用16
反正690有12個cpu
也能夠使用索引提示
 怎麼用??
若是用到某個table的索引
 /*+ index(字段名) */
 提早告訴優化器要用到的索引是嗎?
/*+ index(table名,字段名)*?
 是的,有時你現成的索引,oracle不必定會用,指定後oracle儘可能用你指定的索引
還有什麼好東西啊?大哥啊。給我點資料有不咯?呵呵
 /*+ index(table名,字段名)*/這個是放在select語句裏嗎 ??放在什麼位置啊
 放在第一個關健字後梑
 我用了/*+parallel(emp,2) */還要用 NOLOGGING嗎??
也能夠用
 爽,謝謝。不過很抱歉。今天由於我多加了個/*+append*/使的tcm-cust-rela增大了100多倍,形成表空間不夠,因此數據尚未出來,我剛纔才經過測試找出來。
 優化器多時oracle會根據實際狀況選擇一個來用
 INSERT /*+parallel(TCM_CUST,2) */ INTO TCM_CUST NOLOGGING (字段)values(值) 這種寫法對不?
關於這方面的書,我明天找一下,若是有我發給你,我手頭上有一本事,但講的不多。
 好。我如今給大家準備數據。鬱悶啊。浪費了一天的時間。
  這樣很快的
 690一共12個cpu ,我填10個會不會有問題啊?
 晚上別熬的太晚了
 沒事,oracle有大量的併發能力,關健要看數據有沒有把值設的大一點,如今業務少,能夠這麼作

select * from (select rownum as aa, a.* from tcm_user a where rownum<100) where aa>10


關於Oracle中的時間計算問題!
--------------------------------------------------------------------------------
  to_date('2003-8-1 18:20', 'yyyy-mm-dd HH24:MI') - to_date('2003-7-3 18:35', 'yyyy-mm-dd HH24:MI')
   獲得一個值,如何將獲得的值轉化爲分鐘?也就是說它們兩個值之間相差的分鐘?
--------------------------------------------------------------------------------

(to_date('2003-8-1 18:20', 'yyyy-mm-dd HH24:MI') - to_date('2003-7-3 18:35', 'yyyy-mm-dd HH24:MI'))*24*60

(dateA-dateB)*1440 = N 分
(dateA-dateB)*86400 = N 秒

  round()四捨五入
  ceil()大於n的最小整數


若是不當心把表給delete掉了而且commit了,沒關係,你能夠用以下語句進行恢復
 select * from tfm_action_list as of timestamp (systimestamp -interval'4000'second)


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=419368

 

 

zhuanzi:blog.csdn.net/jxnucsb2008/article/details/557827

相關文章
相關標籤/搜索