Oracle資料庫資料物件分析 下
阿新 • • 發佈:2018-11-12
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
過程和函式過程和函式都以編譯後的形式存放在資料庫中,函式可以沒有引數也可以有多個引數並有一個返回值。過程有零個或多個引數,沒有返回值。函式和過程都可以通過引數列表接收或返回零個或多個值,函式和過程的主要區別不在於返回值,而在於他們的呼叫方式。過程是作為一個獨立執行語句呼叫的:
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; |