Oracle數據庫數據對象中最基本的是表和視圖,其餘還有約束、序列、函數、存儲過程、包、觸發器等。對數據庫的操做能夠基本歸結爲對數據對象的操做,理解和掌握Oracle數據庫對象是學習Oracle的捷徑。sql
表和視圖數據庫
Oracle中表是數據存儲的基本結構。ORACLE8引入了分區表和對象表,ORACLE8i引入了臨時表,使表的功能更強大。視圖是一個或多個表中數據的邏輯表達式。本文咱們將討論怎樣建立和管理簡單的表和視圖。服務器
管理表數據結構
表能夠看做有行和列的電子數據表,表是關係數據庫中一種擁有數據的結構。用CREATE TABLE語句創建表,在創建表的同時,必須定義表名,列,以及列的數據類型和大小。例如:oracle
CREATE TABLE products函數
( PROD_ID NUMBER(4),性能
PROD_NAME VAECHAR2(20),學習
STOCK_QTY NUMBER(5,3)優化
);spa
這樣咱們就創建了一個名爲products的表, 關鍵詞CREATE TABLE後緊跟的表名,而後定義了三列,同時規定了列的數據類型和大小。
在建立表的同時你能夠規定表的完整性約束,也能夠規定列的完整性約束,在列上普通的約束是NOT NULL,關於約束的討論咱們在之後進行。
在創建或更改表時,能夠給表一個缺省值。缺省值是在增長行時,增長的數據行中某一項值爲null時,oracle即認爲該值爲缺省值。
下列數據字典視圖提供表和表的列的信息:
. DBA_TABLES
. DBA_ALL_TABLES
. USER_TABLES
. USER_ALL_TABLES
. ALL_TABLES
. ALL_ALL_TABLES
. DBA_TAB_COLUMNS
. USER_TAB_COLUMNS
. ALL_TAB_COLUMNS
表的命名規則
表名標識一個表,因此應儘量在表名中描述表,oracle中表名或列名最長能夠達30個字符串。表名應該以字母開始,能夠在表名中包含數字、下劃線、#、$等。
從其它表中創建表
可使用查詢從基於一個或多個表中創建表,表的列的數據類型和大小有查詢結果決定。創建這種形式的表的查詢能夠選擇其餘表中全部的列或者只選擇部分列。在CREATE TABLE語句中使用關鍵字AS,例如:
SQL>CREATE TABLE emp AS SELECT * FROM employee
TABLE CREATED
SQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2
須要注意的是若是查詢涉及LONG數據類型,那麼CREATE TABLE....AS SELECT....將不會工做。
更改表定義
在創建表後,有時候咱們可能須要修改表,好比更改列的定義,更改缺省值,增長新列,刪除列等等。ORACLE使用ALTER TABLE語句來更改表的定義
一、增長列
語法:
ALTER TABLE [schema.] table_name ADD column_definition
例:
ALTER TABLE orders ADD order_date DATE;
TABLE ALTER
對於已經存在的數據行,新列的值將是NULL.
二、更改列
語法:
ALTER TABLE [schema.] table_name MODIFY column_name new_attributes;
例:
ALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15));
這個例子中咱們修改了表orders,將STATUS列的長度增長到15,將QUANTITY列減少到10,3;
修改列的規則以下:
. 能夠增長字符串數據類型的列的長度,數字數據類型列的精度。
. 減小列的長度時,該列應該不包含任何值,全部數據行都爲NULL.
. 改變數據類型時,該列的值必須是NULL.
. 對於十進制數字,能夠增長或減小但不能下降他的精度。
三、刪除數據列
優化ORACLE數據庫,惟一的方法是刪除列,從新創建數據庫。在ORACLE8i中有不少方法刪除列,你能夠刪除未用數據列或者能夠標示該列爲未用數據列而後刪除。
刪除數據列的語法是:
ALTER TABLE [schema.] table_name DROP {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
要注意的是在刪除列時關於該列的索引和完整性約束也同時刪除。注意關鍵字CASCADE CONSTRAINS,若是刪除的列是多列約束的一部分,那麼這個約束條件相對於其餘列也同時刪除。
若是用戶擔憂在大型數據庫中刪除列要花太多時間,能夠先將他們標記爲未用數據列,標記未用數據列的語法以下:
ALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
這個語句將一個或多個數據列標記爲未用數據列,但並不刪除數據列中的數據,也不釋放佔用的磁盤空間。可是,未用數據列在視圖和數據字典中並不顯示,而且該數據列的名稱將被刪除,新的數據列可使用這個名稱。基於該數據列的索引、約束,統計等都將被刪除。
刪除未用數據列的語句是:
ALTER TABLE [schema.] table_name DROP {UNUSED COLUM | COLUMN CONTINUE}
刪除表和更改表名
刪除表很是簡單,但它是一個不可逆轉的行爲。
語法:
DROP TABLE [schema.] table_name [CASCADE CONSTRAINTS]
刪除表後,表上的索引、觸發器、權限、完整性約束也同時刪除。ORACLE不能刪除視圖,或其餘程序單元,但oracle將標示他們無效。若是刪除的表涉及引用主鍵或惟一關鍵字的完整性約束時,那麼DROP TABLE語句就必須包含CASCADE CONSTRAINTS子串。
更改表名
RENAME命令用於給表和其餘數據庫對象更名。ORACLE系統自動將基於舊錶的完整性約束、索引、權限轉移到新表中。ORACLE同時使全部基於舊錶的數據庫對象,好比視圖、程序、函數等,爲不合法。
語法:
RENAME old_name TO new_name;
例:
SQL> RENAME orders TO purchase_orders;
TABLE RENAMED
截短表
TRUNCATE命令與DROP命令類似, 但他不是刪除整個數據表,因此索引、完整性約束、觸發器、權限等都不會被刪除。缺省狀況下將釋放部分表和視圖空間,若是用戶不但願釋放表空間,TRUNCATE語句中要包含REUSE STORAGE子串。TRUNCATE命令語法以下:
TRUNCATE {TABLE|CLUSTER} [schema.] name {DROP|REUSE STORAGE}
例:
SQL> TRUNCATE TABLE t1;
TABLE truncate.
視圖(VIEW)
視圖是一個或多個表中的數據的簡化描述,用戶能夠將視圖當作一個存儲查詢(stored query)或一個虛擬表(virtual table).查詢僅僅存儲在oracle數據字典中,實際的數據沒有存放在任何其它地方,因此創建視圖不用消耗其餘的空間。視圖也能夠隱藏複雜查詢,好比多表查詢,但用戶只能看見視圖。視圖能夠有與他所基於表的列名不一樣的列名。用戶能夠創建限制其餘用戶訪問的視圖。
創建視圖
CREATE VIEW命令建立視圖,定義視圖的查詢能夠創建在一個或多個表,或其餘視圖上。查詢不能有FOR UPDATE子串,在早期的ORACLE8i版本中不支持ORDER BY子串,如今的版本中CREATE VIEW能夠擁有ORDER BY子串。
例:
SQL> CREATE VIEW TOP_EMP AS
SELECT empno EMPLOYEE_ID,ename EMPLOYEE_NAME,salary
FROM emp
WHERE salary >2000
用戶能夠在建立視圖的同時更改列名,方法是在視圖名後當即加上要命名的列名。從新定義視圖須要包含OR REPLACE子串。
SQL> CREATE VIEW TOP_EMP
(EMPLOYEE_ID,EMPLOYEE_NAME,SALARY) AS
SELECT empno ,ename ,salary
FROM emp
WHERE salary >2000
若是在建立的視圖包含錯誤在正常狀況下,視圖將不會被建立。但若是你須要建立一個帶錯誤的視圖必須在CREATE VIEW語句中帶上FORCE選項。如:
CREATE FORCE VIEW ORDER_STATUS AS
SELECT * FROM PURCHASE_ORDERS
WHERE STATUS=APPPOVE;
SQL>/
warning :View create with compilation errors
這樣將建立了一個名爲ORDER_STATUS的視圖,但這樣的視圖的狀態是不合法的,若是之後狀態發生變化則能夠從新編譯,其狀態也變成合法的。
從視圖中得到數據
從視圖中得到數據與從表中得到數據基本同樣,用戶能夠在鏈接和子查詢中使用視圖,也可使用SQL函數,以及全部SELECT語句的字串。
插入、更新、刪除數據
用戶在必定的限制條件下能夠經過視圖更新、插入、刪除數據。若是視圖鏈接多個表,那麼在一個時間裏只能更新一個表。全部的能被更新的列能夠在數據字典USER_UPDATETABLE_COLUMNS中查到。
用戶在CREATE VIEW中可使用了WITH子串。WITH READ ONLY子串表示建立的視圖是一個只讀視圖,不能進行更新、插入、刪除操做。WITH CHECK OPTION表示能夠進行插入和更新操做,但應該知足WHERE子串的條件。這個條件就是建立視圖WHERE子句的條件,好比在上面的例子中用戶建立了一個視圖TOP_EMP,在這個視圖中用戶不能插入salary小於2000的數據行。
刪除視圖
刪除視圖使用DROP VIEW命令。同時將視圖定義從數據字典中刪除,基於視圖的權限也同時被刪除,其餘涉及到該視圖的函數、視圖、程序等都將被視爲非法。
例:
DROP VIEW TOP_EMP;
完整性約束
完整性約束用於加強數據的完整性,Oracle提供了5種完整性約束:
Check
NOT NULL
Unique
Primary
Foreign key
完整性約束是一種規則,不佔用任何數據庫空間。完整性約束存在數據字典中,在執行SQL或PL/SQL期間使用。用戶能夠指明約束是啓用的仍是禁用的,當約束啓用時,他加強了數據的完整性,不然,則反之,但約束始終存在於數據字典中。
禁用約束,使用ALTER語句
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;
或
ALTER TABLE policies DISABLE CONSTRAINT chk_gender
若是要從新啓用約束:
ALTER TABLE policies ENABLE CONSTRAINT chk_gender
刪除約束
ALTER TABLE table_name DROP CONSTRAINT constraint_name
或
ALTER TABLE policies DROP CONSTRAINT chk_gender;
Check 約束
在數據列上Check 約束須要 一個特殊的布爾條件或者將數據列設置成TRUE,至少一個數據列的值是NULL,Check約束用於加強表中數據內容的簡單的商業規則。用戶使用Check約束保證數據規則的一致性。Check約束能夠涉及該行同屬Check約束的其餘數據列但不能涉及其餘行或其餘表,或調用函數SYSDATE,UID,USER,USERENV。若是用戶的商業規則須要這類的數據檢查,那麼可使用觸發器。Check約束不保護LOB數據類型的數據列和對象、嵌套表、VARRY、ref等。單一數據列能夠有多個Check約束保護,一個Check約束能夠保護多個數據列。
建立表的Check約束使用CREATE TABLE語句,更改表的約束使用ALTER TABLE語句。
語法:
CONSTRAINT [constraint_name] CHECK (condition);
Check約束能夠被建立或增長爲一個表約束,當Check約束保護多個數據列時,必須使用表約束語法。約束名是可選的而且若是這個名字不存在,那麼oracle將產生一個以SYS_開始的惟一的名字。
例:
CREATE TABLE policies
(policy_id NUMBER,
holder_name VARCHAR2(40),
gender VARCHAR2(1) constraint chk_gender CHECK (gender in (M,F),
marital_status VARCHAR2(1),
date_of_birth DATE,
constraint chk_marital CHECK (marital_status in(S,M,D,W))
);
NOT NULL約束
NOT NULL約束應用在單一的數據列上,而且他保護的數據列必需要有數據值。缺省情況下,ORACLE容許任何列均可以有NULL值。某些商業規則要求某數據列必需要有值,NOT NULL約束將確保該列的全部數據行都有值。
例:
CREATE TABLE policies
(policy_id NUMBER,
holder_name VARCHAR2(40) NOT NULL,
gender VARCHAR2(1),
marital_status VARCHAR2(1),
date_of_birth DATE NOT NULL
);
對於NOT NULL的ALTER TABLE語句與其餘約束稍微有點不一樣。
ALTER TABLE policies MODIFY holder_name NOT NULL
惟一性約束(Unique constraint)
惟一性約束能夠保護表中多個數據列,保證在保護的數據列中任何兩行的數據都不相同。惟一性約束與表一塊兒建立,在惟一性約束建立後,可使用ALTER TABLE語句修改。
語法:
column_name data_type CONSTRAINT constraint_name UNIQUE
若是惟一性約束保護多個數據列,那麼惟一性約束要做爲表約束增長。語法以下:
CONSTRAINT constraint_name (column) UNIQUE USING INDEX TABLESPACE (tablespace_name) STORAGE (stored clause)
惟一性約束由一個B-tree索引加強,因此能夠在USING子串中爲索引使用特殊特徵,好比表空間或存儲參數。CREATE TABLE語句在建立惟一性約束的同時也給目標數據列創建了一個惟一的索引。
CREATE TABLE insured_autos
(policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
vin VARCHAR2(10),
coverage_begin DATE,
coverage_term NUMBER,
CONSTRAIN unique_auto UNIQUE (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
);
用戶能夠禁用未以性約束,但他仍然存在,禁用惟一性約束使用ALTER TABLE 語句
ALTER TABLE insured_autos DISABLE CONSTRAIN unique_name;
刪除惟一性約束,使用ALTER TABLE....DROP CONSTRAIN語句
ALTER TABLE insured_autos DROP CONSTRAIN unique_name;
注意用戶不能刪除在有外部鍵指向的表的惟一性約束。這種狀況下用戶必須首先禁用或刪除外部鍵(foreign key)。
刪除或禁用惟一性約束一般同時刪除相關聯的惟一索引,於是下降了數據庫性能。常常刪除或禁用惟一性約束有可能致使丟失索引帶來的性能錯誤。要避免這樣錯誤,能夠採起下面的步驟:
一、在惟一性約束保護的數據列上建立非惟一性索引。
二、添加惟一性約束
主鍵(Primary Key)約束
表有惟一的主鍵約束。表的主鍵能夠保護一個或多個列,主鍵約束可與NOT NULL約束共同做用於每一數據列。NOT NULL約束和惟一性約束的組合將保證主鍵惟一地標識每一行。像惟一性約束同樣,主鍵由B-tree索引加強。
建立主鍵約束使用CREATE TABLE語句與表一塊兒建立,若是表已經建立了,可使用ALTER TABLE語句。
CREATE TABLE policies
(policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
holder_name VARCHAR2(40),
gender VARCHAR2(1),
marital_status VARCHAR2(1),
date_of_birth DATE
);
與惟一性約束同樣,若是主鍵約束保護多個數據列,那麼必須做爲一個表約束建立。
CREATE TABLE insured_autos
(policy_id NUMBER,
vin VARCHAR2(40),
coverage_begin DATE,
coverage_term NUMBER,
CONSTRAINT pk_insured_autos PRIMARY KEY (policy_id,vin)
USING INDEX TABLESPACE index
STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
);
禁用或刪除主鍵必須與ALTER TABLE 語句一塊兒使用
ALTER TABLE policies DROP PRIMARY KEY;
或
ALTER TABLE policies DISABLE PRIMARY KEY;
外部鍵約束(Foreign key constraint)
外部鍵約束保護一個或多個數據列,保證每一個數據行的數據包含一個或多個null值,或者在保護的數據列上同時擁有主鍵約束或惟一性約束。引用(主鍵或惟一性約束)約束能夠保護同一個表,也能夠保護不一樣的表。與主鍵和惟一性約束不一樣外部鍵不會隱式創建一個B-tree索引。在處理外部鍵時,咱們經常使用術語父表(parent table)和子表(child table),父表表示被引用主鍵或惟一性約束的表,子表表示引用主鍵和惟一性約束的表。
建立外部鍵使用CREATE TABLE語句,若是表已經創建了,那麼使用ALTER TABLE語句。
CREATE TABLE insured_autos
(policy_id NUMBER CONSTRAINT policy_fk
REFERENCE policies(policy_id
ON DELETE CASCADE,
vin VARCHAR2(40),
coverage_begin DATE,
coverage_term NUMBER,
make VARCHAR2(30),
model VARCHAR(30),
year NUMBER,
CONSTRAIN auto_fk FROEIGN KEY (make,model,year)
REFERENCES automobiles (make,model,year)
ON DELETE SET NULL
);
ON DELETE子串告訴ORACLE若是父紀錄(parent record)被刪除後,子記錄作什麼。缺省狀況下禁止在子記錄還存在的狀況下刪除父紀錄。
外部鍵和NULL值
在外部鍵約束保護的數據列中NULL值的處理可能產生不可預料的結果。ORACLE 使用ISO standar Match None規則加強外部鍵約束。這個規則規定若是任何外部鍵做用的數據列包含有一個NULL值,那麼任何保留該鍵的數據列在父表中沒有匹配值。
好比,在父表AUTOMOBILES中,主鍵做用於數據列MAKE,MODEL,YEAR上,用戶使用的表INSURED_AUTOS有一個外部約束指向AOTOMOBILES,注意在INSURES_AUTOS中有一數據行的MODEL列爲NULL值,這一行數據已經經過約束檢查,即便MAKE列也沒有顯示在父表AUTOMOBILES中,以下表:
表1 AUTOMOBILES
MAKE MODEL YEAR
Ford Taurus 2000
Toyota Camry 1999
表2 INSURED_AUTOS
POLICY_ID MAKE MODEL YEAR
576 Ford Taurus 2000
577 Toyota Camry 1999
578 Tucker NULL 1949
延遲約束檢驗(Deferred Constraint Checking)
約束檢驗分兩種狀況,一種是在每一條語句結束後檢驗數據是否知足約束條件,這種檢驗稱爲當即約束檢驗(immediately checking),另外一種是在事務處理完成以後對數據進行檢驗稱之爲延遲約束檢驗。在缺省狀況下Oracle約束檢驗是當即檢驗(immediately checking),若是不知足約束將先是一條錯誤信息,但用戶能夠經過SET CONSTRAINT語句選擇延遲約束檢驗。語法以下:
SET CONSTRAINT constraint_name|ALL DEFEERRED|IMMEDIATE --;
序列(Sequences)
Oracle序列是一個連續的數字生成器。序列經常使用於人爲的關鍵字,或給數據行排序不然數據行是無序的。像約束同樣,序列只存在於數據字典中。序列號能夠被設置爲上升、降低,能夠沒有限制或重複使用直到一個限制值。建立序列使用SET SEQUENCE語句。
CREATE SEQUENCE [schema] sequence KEYWORD
KEYWORD包括下面的值:
KEYWORD 描述
START WITH 定義序列生成的第一個數字,缺省爲1
INCREMENT BY 定義序列號是上升仍是降低,對於一個降序的序列INCREMENT BY爲負值
MINVALUE 定義序列能夠生成的最小值,這是降序序列中的限制值。缺省狀況下該值爲NOMINVALUE,NOMINVALUE,對於升序爲1,對於降序爲-10E26.
MAXVALUE 序列能生成的最大數字。這是升序序列中的限制值,缺省的MAXVALUE爲NOMAXVALUE,NOMAXVALUE,對於升序爲10E26,對於降序爲-1。
CYCLE 設置序列值在達到限制值之後能夠重複
NOCYCLE 設置序列值在達到限制值之後不能重複,這是缺省設置。當試圖產生MAXVALUE+1的值時,將會產生一個異常
CACHE 定義序列值佔據的內存塊的大小,缺省值爲20
NOCACHE 在每次序列號產生時強制數據字典更新,保證在序列值之間沒有間隔當建立序列時,START WITH值必須等於或大於MINVALUE。
刪除序列使用DROP SEQUENCE語句
DROP SEQUENCE sequence_name
索引(INDEXES)
索引是一種能夠提升查詢性能的數據結構,在這一部分咱們將討論索引如何提升查詢性能的。ORACLE提供瞭如下幾種索引:
B-Tree、哈希(hash)、位圖(bitmap)等索引類型
基於原始表的索引
基於函數的索引
域(Domain)索引
實際應用中主要是B-Tree索引和位圖索引,因此咱們將集中討論這兩種索引類型。
B-Tree索引
B-Tree索引是最普通的索引,缺省條件下創建的索引就是這種類型的索引。B-Tree索引能夠是惟一或非惟一的,能夠是單一的(基於一列)或鏈接的(多列)。B-Tree索引在檢索高基數數據列(高基數數據列是指該列有不少不一樣的值)時提供了最好的性能。對於取出較小的數據B-Tree索引比全表檢索提供了更有效的方法。但當檢查的範圍超過表的10%時就不能提升取回數據的性能。正如名字所暗示的那樣,B-Tree索引是基於二元樹的,由枝幹塊(branch block)和樹葉塊(leaf block)組成,枝幹塊包含了索引列(關鍵字)和另外一索引的地址。樹葉塊包含了關鍵字和給表中每一個匹配行的ROWID。
位圖索引
位圖索引主要用於決策支持系統或靜態數據,不支持行級鎖定。位圖索引能夠是簡單的(單列)也能夠是鏈接的(多列),但在實踐中絕大多數是簡單的。位圖索引最好用於低到中羣集(cardinality)列,在這些列上多位圖索引能夠與AND或OR操做符結合使用。位圖索引使用位圖做爲鍵值,對於表中的每一數據行位圖包含了TRUE(1)、FALSE(0)、或NULL值。位圖索引的位圖存放在B-Tree結構的頁節點中。B-Tree結構使查找位圖很是方便和快速。另外,位圖以一種壓縮格式存放,所以佔用的磁盤空間比B-Tree索引要小得多。
同義詞(Synonyms)
對另外一個數據對象而言同義詞是一個別名。public同義詞是針對全部用戶的,相對而言private同義詞則只針對對象擁有者或被授予權限的帳戶。在本地數據庫中同義詞能夠表示表、視圖、序列、程序、函數或包等數據對象,也能夠經過連接表示另外一個數據庫的對象。
建立同義詞語法以下:
CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.] object[@db_link];
例:
CREATE PUBLIC SYNONYM policies FOR poladm.policies@prod;
CREATE SYNONYM plan_table FOR system.plan_table;
過程和函數
過程和函數都以編譯後的形式存放在數據庫中,函數能夠沒有參數也能夠有多個參數並有一個返回值。過程有零個或多個參數,沒有返回值。函數和過程均可以經過參數列表接收或返回零個或多個值,函數和過程的主要區別不在於返回值,而在於他們的調用方式。過程是做爲一個獨立執行語句調用的:
pay_involume(invoice_nbr,30,due_date);
函數以合法的表達式的方式調用:
order_volumn:=open_orders(SYSDATE,30);
建立過程的語法以下:
CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name
[parameter_lister]
{AS|IS}
declaration_section
BEGIN
executable_section
[EXCEPTION
exception_section]
END [procedure_name]
每一個參數的語法以下:
paramter_name mode datatype [(:=|DEFAULT) value]
mode有三種形式:IN、OUT、INOUT。
IN表示在調用過程的時候,實際參數的取值被傳遞給該過程,形式參數被認爲是隻讀的,當過程結束時,控制會返回控制環境,實際參數的值不會改變。
OUT在調用過程時實際參數的取值都將被忽略,在過程內部形式參數只能是被賦值,而不能從中讀取數據,在過程結束後形式參數的內容將被賦予實際參數。
INOUT這種模式是IN和OUT的組合;在過程內部實際參數的值會傳遞給形式參數,形勢參數的值可讀也可寫,過程結束後,形勢參數的值將賦予實際參數。
建立函數的語法和過程的語法基本相同,惟一的區別在於函數有RETUREN子句
CREATE [ OR REPLACE] FINCTION [schema.]function_name
[parameter_list]
RETURN returning_datatype
{AS|IS}
declaration_section
BEGIN
executable_section
[EXCEPTION]
exception_section
END [procedure_name]
在執行部分函數必須有喲個或多個return語句。
在建立函數中能夠調用單行函數和組函數,例如:
CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER)
RETURN NUMBER
IS
pi NUMBER=ACOS(-1);
RadiansPerDegree NUMBER;
BEGIN
RadiansPerDegree=pi/180;
RETURN(SIN(DegreesIn*RadiansPerDegree));
END
包
包是一種將過程、函數和數據結構捆綁在一塊兒的容器;包由兩個部分組成:外部可視包規範,包括函數頭,過程頭,和外部可視數據結構;另外一部分是包主體(package body),包主體包含了全部被捆綁的過程和函數的聲明、執行、異常處理部分。
打包的PL/SQL程序和沒有打包的有很大的差別,包數據在用戶的整個會話期間都一直存在,當用戶得到包的執行受權時,就等於得到包規範中的全部程序和數據結構的權限。但不能只對包中的某一個函數或過程進行受權。包能夠重載過程和函數,在包內能夠用同一個名字聲明多個程序,在運行時根據參數的數目和數據類型調用正確的程序。
建立包必須首先建立包規範,建立包規範的語法以下:
CREATE [OR REPLACE] PACKAGE package_name
{AS|IS}
public_variable_declarations |
public_type_declarations |
public_exception_declarations |
public_cursor_declarations |
function_declarations |
procedure_specifications
END [package_name]
建立包主體使用CREATE PACKAGE BODY語句:
CREATE [OR REPLACE] PACKAGE BODY package_name
{AS|IS}
private_variable_declarations |
private_type_declarations |
private_exception_declarations |
private_cursor_declarations |
function_declarations |
procedure_specifications
END [package_name]
私有數據結構是那些在包主體內部,對被調用程序而言是不可見的。
觸發器(Triggers)
觸發器是一種自動執行響應數據庫變化的程序。能夠設置爲在觸發器事件以前或以後觸發或執行。可以觸發觸發器事件的事件包括下面幾種:
DML事件
DDL事件
數據庫事件
DML事件觸發器能夠是語句或行級觸發器。DML語句觸發器在觸發語句以前或以後觸發DML行級觸發器在語句影響的行變化以前或以後觸發。用戶能夠給單一事件和類型定義多個觸發器,但沒有任何方法能夠加強多觸發器觸發的命令。下表列出了用戶能夠利用的觸發器事件:
事件 觸發器描述
INSERT 當向表或視圖插入一行時觸發觸發器
UPDATE 更新表或視圖中的某一行時觸發觸發器
DELETE 從表或視圖中刪除某一行時觸發觸發器
CREATE 當使用CREATE語句爲數據庫或項目增長一個對象時觸發觸發器
ALTER 當使用ALTER語句爲更改一個數據庫或項目的對象時觸發觸發器
DROP 當使用DROP語句刪除一個數據庫或項目的對象時觸發觸發器
START 打開數據庫時觸發觸發器,在事件後觸發
SHUTDOWN 關閉數據庫時觸發,事件前觸發
LOGON 當一個會話創建時觸發,事件前觸發
LOGOFF 當關閉會話時觸發,事件前觸發
SERVER 服務器錯誤發生時觸發觸發器,事件後觸發
建立觸發器的語法以下:
CREATE [OR REPLACE] TRIGGER trigger_name
{before|after|instead of} event
ON {table_or_view_name|DATABASE}
[FOR EACH ROW[WHEN condition]]
trigger_body
只有DML觸發器(INSERT、UPDATE、DELETE)語句可使用INSTEAD OF觸發器而且只有表的DML觸發器能夠是BEFORE或AFTER觸發器。
象約束同樣觸發器能夠被設置爲禁用或啓用來關閉或打開他們的執行體(EXECUTE),將觸發器設置爲禁用或啓用使用ALTER TRIGGER語句:
ALTER TRIGGER trigger_name ENABLE;
ALTER TRIGGER trigger_name DISABLE;
要禁用或啓用表的全部觸發器,使用ALTER TABLE語句
ALTER TRIGGER table_name DISABLE ALL TRIGGER;
ALTER TRIGGER table_name ENABLE ALL TRIGGER;
刪除觸發器使用DROP TRIGGER
DROP TRIGGER trigger_name;
數據字典
Oracle數據字典包含了用戶數據庫的元數據。帶下劃線的表名稱中帶OBJ$、UET$、SOURCE$,這些表是在執行CREATE DATABASE語句期間由sql.bsq腳本建立的,通常狀況下用戶不多訪問這些表。腳本catalog.sql(一般位於$oracle_home/rdbms/admin)在CREATE DATABASE語句以後當即運行,建立數據字典視圖。
數據字典視圖大體能夠分爲三類:
.前綴爲USER_的數據字典視圖,包含了用戶擁有的對象的信息。
.前綴爲ALL_的數據字典視圖,包含了用戶當前能夠訪問的所有對象和權限的信息。
.前綴爲DBA_的數據字典視圖,包含了數據庫擁有的全部對象和權限的信息。
在絕大多數數據字典視圖中都有象DBA_TABLES,ALL_TABLES和USER_TABLES這樣的視圖家族。Oracle中有超過100個視圖家族,因此要全面介紹這些視圖家族是單調乏味的並且沒有多大的意義。在下表中列出了最重要和最經常使用的視圖家族,須要注意的是每一個視圖家族都有一個DBA_,一個ALL_一個USER_視圖。
視圖家族(View Family) 描述
COL_PRIVS 包含了表的列權限,包括授予者、被授予者和權限
EXTENTS 數據範圍信息,好比數據文件,數據段名(segment_name)和大小
INDEXES 索引信息,好比類型、惟一性和被涉及的表
IND_COLUMNS 索引列信息,好比索引上的列的排序方式
OBJECTS 對象信息,好比狀態和DDL time
ROLE_PRIVS 角色權限,好比GRANT和ADMIN選項
SEGMENTS 表和索引的數據段信息,好比tablespace和storage
SEQUECNCES 序列信息,好比序列的cache、cycle和ast_number
SOURCE 除觸發器以外的全部內置過程、函數、包的源代碼
SYNONYMS 別名信息,好比引用的對象和數據庫連接db_link
SYS_PRIVS 系統權限,好比grantee、privilege、admin選項
TAB_COLUMNS 表和視圖的列信息,包括列的數據類型
TAB_PRIVS 表權限,好比授予者、被授予者和權限
TABLES 表信息,好比表空間(tablespace),存儲參數(storage parms)和數據行的數量
TRIGGERS 觸發器信息,好比類型、事件、觸發體(trigger body)
USERS 用戶信息,好比臨時的和缺省的表空間
VIEWS 視圖信息,包括視圖定義
在Oracle中還有一些不經常使用的數據字典表,但這些表不是真正的字典家族,他們都是一些重要的單一的視圖。
VIEW NAME 描述
USER_COL_PRIVS_MADE 用戶授予他人的列權限
USER_COL_PRIVS_RECD 用戶得到的列權限
USER_TAB_PRIVS_MADE 用戶授予他人的表權限
USER_TAB_PRIVS_RECD 用戶得到的表權限
其餘的字典視圖中主要的是V$視圖,之因此這樣叫是由於他們都是以V$或GV$開頭的。V$視圖是基於X$虛擬視圖的。V$視圖是SYS用戶所擁有的,在缺省情況下,只有SYS用戶和擁有DBA系統權限的用戶能夠看到全部的視圖,沒有DBA權限的用戶能夠看到USER_和ALL_視圖,但不能看到DBA_視圖。與DBA_,ALL,和USER_視圖中面向數據庫信息相反,這些視圖可視的給出了面向實例的信息。
在大型系統上化幾周時間手工輸入每一條語句
手工輸入帶用戶名變量的語句,而後再輸入每個用戶名,這須要花好幾個小時的時間
寫一條SQL語句,生成須要的ALTER USER語句,而後執行他,這隻須要幾分鐘時間
很明顯咱們將選擇生成SQL的方法:
例:
SELECT ALTER USER||username||
TEMPORARY TABLESPACE temp;
FROM DBA_USERS
WHERE username<>SYS
AND temporary_tablespace<>TEMP;
這個查詢的結果將被脫機處理到一個文件中,而後在執行:
ALTER USER SYSTEM TEMPORARY TABLESPACE temp;
ALTER USER OUTLN TEMPORARY TABLESPACE temp;
ALTER USER DBSNMP TEMPORARY TABLESPACE temp;
ALTER USER SCOTT TEMPORARY TABLESPACE temp;
ALTER USER DEMO TEMPORARY TABLESPACE temp;