Chpt 1 一、基本名詞 1.資料庫:實際上是一個信息列表 2.資料庫程式:虛擬的列表管理員 3.表:只用於存儲一類事情的信息,保持不同信息分類之間的獨立性可以讓資料庫以一種嚴密的組織方式高效地存儲信息 4.行/記錄:每一行都包含一個(且只有一個)由表名稱定義的項目信息 5.列/欄位:包含特定事物 ...
Chpt 1
一、基本名詞
1.資料庫:實際上是一個信息列表
2.資料庫程式:虛擬的列表管理員
3.表:只用於存儲一類事情的信息,保持不同信息分類之間的獨立性可以讓資料庫以一種嚴密的組織方式高效地存儲信息
4.行/記錄:每一行都包含一個(且只有一個)由表名稱定義的項目信息
5.列/欄位:包含特定事物的單個信息段
6.SQL:Structured Query Language,結構化查詢語言(查詢資料庫標準語言)
二、資料庫特點
1.存儲信息量大 2.多用戶 3.健壯安全 4.關聯 5.數據約束
三、SQL命令分類
1.數據定義(DDL,對錶的操作):CREATE、ALTER、DROP(不可逆)、RENAME、TRUNCATE
2.數據操作(DML,對記錄的操作):INSERT、UPDATE、DELETE
3.數據控制(DCL,對許可權的操作):GRANT、REVOKE
4.數據檢索(DSL,檢索數據):SELECT及其參數
5.事務控制:ROLLBACK、SAVEPOINT、COMMIT
Chpt 2
一、表和列的命名規則
1.最大長度30字元 2.可以包含數字字母下劃線 3.首字元必須是字母 4.大小寫等價
5.不可包含空格 6.同一個用戶空間中表不可重名 7.不可單獨使用保留字
二、Oracle的數據類型
1.文本:文本類型可以存儲用鍵盤輸入的任何內容,文本形式的數字不能做任何數學運算;文本數據通常都用單引號括起來;在文本類型中經常包含單引號,需要使用兩個個單引號(’’)的形式進行轉義
(1) CHAR:定義欄位時需要指定該欄位可以容納的最大字數,若不指定則預設長度為1;若輸入字數小於最大字數,則自動在輸入字元後補空格;範圍4KB
CREATE TABLE table_name (column_name CHAR(n))
(2) VARCHAR2:變長文本,範圍4KB
(3) LONG:範圍2GB
(4) CLOB:範圍4GB
2.數字:
NUMBER:存儲數字,需要指定位數
NUMBER(total_number_of_digits, digits_after_a_decimal_point)
3.日期:採用儒略歷,開始日期為公元前4712年1月1日,Oracle會將儒略歷轉換成普通日期,在SQL語句中,日起必須用單引號括起來
4.空值:null,欄位中沒有數據,0不是空,空格也不是空
三、表的基本操作
1.查看表結構:DESCRIBE table_name或DESC table_name
2.插入表數據:(1) INSERT INTO table_name VALUES (value1, value2, …)
(2) INSERT INTO table_name (column_name1, column_name2, …)
VALUES (value1, value2, …)
3.查看表數據:(1) SELECT column_names FROM table_names;
(2) 算術表達式:SELECT column_name1 + column2 FROM table_name
其中column_name1 + column2可以替換為任何列的算術表達式
(3) 列名合併:可以在兩個列名之間使用||,還可以用||連接文本串
SELECT column_name1 || ‘text’ || column_name2 FROM table_name
(4) 列的別名:可以在列頭後面定義別名,如果別名用雙引號括起,那麼就可以包含空格
SELECT column_name alias FROM table_name
SELECT column_name “another alias” FROM table_name
Chapt 3
一、條件查找:SELECT columns FROM table_name WHERE condition(s)
1.條件關鍵字:=,<,>,<=,>=,!=,<>,AND,OR,BETWEEN,IN,NOT,(多字元通配%,單個字元通配_,LIKE),IS NULL,IS NOT NULL
2.檢索結果排序:SELECT column_names FROM table_names ORDER BY columns_to_sort_by
按照columns_to_sort_by中出現的各列的順序一個個排列
3.顯示唯一值:SELECT DISTINCT或SELECT UNIQUE
二、修改表中數據:
UPDATE table_name SET column_name(s) = new_value(s) WHERE condition(s);
三、刪除表中數據:(1) 條件刪除:DELETE table_name WHERE condition(s);
(2) 全部刪除:a. DELETE FROM table_name;
COMMIT之前可逆,在刪除之前會讀取每一列,開銷大
b. TRUNCATE TABLE table_name;
快速,並自動釋放表空間,但不可逆
四、事務控制
1.ROLLBACK(TO savepoint_name):在COMMIT之前撤銷操作
2.SAVEPOINT savepoint_name:保存回滾點,可以直接回滾到這個點
3.COMMIT:將改變永久寫入資料庫
4.隱式COMMIT:所有的DDL命令都會隱式提交未保存的數據
Chapt 4
一、輸出到磁碟
SPOOL spool_file_name
manipulations
SPOOL OFF
將manipulations所造成的屏幕輸出都保存在spool_file_name所指定的文件中,類似於log
二、SQL腳本文件
1.創建或修改:EDIT script_name
2.運行腳本:@script_name
3.腳本變數:可以使用&variable_name的形式在腳本中代替一些暫時不能確定的值,運行腳本時會提示輸入變數值
4.SQL腳本註釋:(1) 單行註釋:-- annotations
(2) 多行註釋:/* annotations */
Chpt 5
一、單行函數:影響每一行記錄
1.系統變數
(1) SYSDATE:返回當前日期和時間,進行加減運算時以天為單位
(2) SYSTIMESTAMP:返回資料庫伺服器當前日期、時間(包括秒)以及時區。
(3) CURRENT_DATE:返回本地電腦當前日期和時間
(4) CURRENT_TIMESTAMP:返回本地電腦當前日期、時間(包括秒)以及時區
(5) USER:返回用戶ID,表示誰在執行函數(其中包含USER函數)
(6) USERENV:返回執行該函數的各種電腦環境參數,包括電腦名,用戶名等
2.數字函數
(1) ROUND(input_value, decimal_places_of_pricision)
對數字進行四捨五入。第一個參數是被操作數;後一個參數若為正,則表示精確到小數點後多少位,若為負,則表示精確到小數點前多少位
(2) TRUNC(input_value, decimal_places_of_pricision)
不進行四捨五入,僅截取有效位數。參數與上相同。
3.文本函數
(1) UPPER(column_name):全部大寫
(2) LOWER(column_name):全部小寫
(3) INITCAP(column_name):首字母大寫
(4) LENGTH(column_name):返迴文本串長度
(5) SUBSTR(source_text, starting_character_position, number_of_characters):
從source_text所指定的長文本中得到起始位置為starting_character_position,長度為number_of_characters的子串
(6) INTSTR(source_text, text_to_locate, starting_character_position):
從source_text所指定的長文本中查找text_to_locate所指定的子串的開始位置
(7) LTRIM(column_name):從左邊刪除多餘空格
(8) RTRIM(column_name):從右邊刪除多餘空格
4.日期處理
(1) SYSDATE和TRUNC:由於SYSDATE不僅返回日期,還返回當前時間(但時間不能顯示),如果在檢索條件中使用SYSDATE那麼就很難匹配,使用TRUNC(SYSDATE)或TRUNC(date_column)的形式,只保留日期。
(2) ADD_MONTHS(‘starting_date’, number_of_months):
在starting_date所指定的日期加上number_of_months所指定的月數
(3) LAST_DAY(‘date’):返回給定日期中當月最後一天
(4) MONTHS_BETWEEN(later_date, earlier_date):返回任意兩個日期之間的月份數
5.數據類型轉換
(1) TO_CHAR(input_value, ‘format_code’):將日期、時間或數字轉換成文本
(2) TO_DATE(input_value, ‘format_code’):將文本形式的日期或時間轉換成日期/時間類型
6.其它函數
(1) DECODE(類似於C中的switch-case用法):
語法:DECODE(incoming_source,
Incoming_value_1, outgoing_result_1,
Incoming_value_2, outgoing_result_2,
……
Last_incoming_value, last_outgoing_result,
[default_outgoing_result_if_no_match])
解釋:incoming_value與outgoing_result是因果輸出對,當滿足incoming_value時就輸出outgoing_result,若沒有找到滿足項,則輸出可選的default_outgoing_result_if_no_match
(2) NVL(input_value, result_if_input_value_is_null):若input_value為空,則輸出result_if_input_value_is_null
二、組函數
1.SUM(column_name):計算符合條件的列中數據的總合
2.COUNT(column_name):計算符合條件的記錄的總數
3.AVG(column_name):計算符合條件的列的平均值
4.MIN(column_name):返回符合條件的列的集合中的最小值
5.MAX(column_name):返回符合條件的列的集合中的最大值
6.GROUP BY column_name:依據column_name所指定的列進行結果分組
7.HAVING condition:對檢索結果集進行二次過濾,通常condition為一個算術表達式
Chpt 6
一、索引表
1.定義:一種輔助隱藏表,該表包含主表的一個或多個重要列,並包含指向主表每行記錄的指針(主表行號),索引表比它指向的主表小很多,一個主表可以有多個索引表。Oracle索引中可以包含的最大列數為32。
2.特點
(1) 改變表時:索引表與主表會自動保持同步,任何對於主表的改變都會自動改變索引,所以INSERT、UPDATE、DELETE等操作時間都會被延長。
(2) 檢索表時:索引表的檢索速度很快,檢索到結果後可直接根據行指針定位到主表記錄,故能夠加快檢索速度。
3.創建索引:
CREATE INDEX index_name ON table_name (first_column_name, second_column_name, …);
其中column_name既可以是列名,也可以是對列的函數計算
4.刪除索引:DROP INDEX index_name;
5.索引類型
(1) B*-樹索引:在創建B*-樹索引時,Oracle分析索引列中的值,並確定如何將表分離成帶有相同記錄號的“葉塊”。然後創建“分支塊”層,以儘可能少的步驟查找低層葉塊中的記錄。適合於索引列中包含大量不同的值時使用。
(2) 點陣圖索引:當索引列為低基數(不同的值少)列時,創建點陣圖索引可以極大地減少檢索時間,因為點陣圖索引非常小(用少量的位表示不同的值),且電腦可以快速處理0、1位數據。CREATE BITMAP INDEX index_name ON table_name (column_name);
二、約束
1.定義:約束是定義數據在插入表中之前必須符合的條件的方法。約束作為表定義的一部分而保存,一旦創建,就會自動執行。
2.約束種類
(1) NOT NULL:非空約束
a.創建表時定義:CREATE TABLE table_name (column_name NOT NULL);
b.修改現有表:ALTER TABLE table_name MODIFY (column_name NOT NULL);
(2) UNIQUE:唯一性約束
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column_name(s));
或CREATE UNIQUE INDEX constraint_name ON table_name (column_name(s));
(3) CHECK:自定義約束
ALTER TABLE table_name ADD CONSTRAINT [constraint_name]
CHECK (column_name condition_to_satisfy);
其中的column_name condition_to_satisfy形式與WHERE子句中的條件相同
3.刪除約束
(1) 對於NOT NULL:ALTER TABLE table_name MODIFY (column_name NULL);
(2) 對於CONSTRAINT:ALTER TABLE table_name DROP CONSTRAINT constraint_name;
4.禁用與啟用約束
(1) 禁用:ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;
(2) 啟用:ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
三、表間關聯
1.“一對多”關聯:在父/子表關係中,子表中的多個記錄可以調用父表中的單個記錄,例如多個員工表的記錄可以調用同一個部門表的記錄。
2.主鍵與外鍵
(1) 主鍵:能夠唯一確定一條記錄的一個(或多個)欄位,是調用表中記錄的主要方法,用PK表示。
a.創建表時定義:CREATE TABLE table_name (column_name PRIMARY KEY);
b.修改現有表:ALTER TABLE table_name ADD PRIMARY KEY (column_name(s));
(2) 外鍵:為了將父表的主鍵用於關聯,必須在子表中進行調用。子表中包含的某個欄位(或多個欄位)必須與父表中的主鍵有相同的數據類型(欄位名可以不同),在需要創建引用父表記錄的子表記錄時,必須在子表記錄中包含父表的主鍵值。在子表中包含父表主鍵值的欄位成為外鍵,外鍵允許子表中的記錄引用父表記錄,用FK表示。
a.創建表時定義:TODO
b.修改現有表:ALTER TABLE child_table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY (column_name(s)_in_child_table)
REFERENCES parent_table_name (column_name(s)_in_parent_table);
(3) 作用:在父表中輸入數據,然後在其它多個子表中調用該數據,避免了重覆輸入。
3.實體關係圖(ER圖,Entity Relational Diagram):資料庫中各個表的關係圖。
4.笛卡爾乘積:在對多表進行檢索的時候,沒有使用WHERE子句而產生的結果,檢索記錄數為各張表記錄數的連乘積。
5.外連接
(1) parent_table_name.primary_key = child_table_name.foreign_key (+)
父表中的每條記錄不一定都包含在子表中,(+)表示該符號前面的表可能不包含另一個表中的所有記錄,一般(+)符號放置在子表名稱的後面,這是因為父表可以包含子表沒有的數據,但子表不能包含與父表不匹配的數據。
(2)SQL 1999標準:
SELECT columns
FROM
table_1 LEFT/RIGHT/FULL OUTER JOIN table_2
ON (table_1.column1 = table_2.column2)
(1)LEFT OUTER JOIN:此連接左邊的表影響輸出結果
(2)RIGHT OUTER JOIN:此連接右邊的表影響輸出結果
(3)FULL OUTER JOIN:此連接兩邊的表的記錄都顯示
四、連接運算符:
1.UNION:合併兩個SELECT語句產生的檢索結果,不顯示重覆記錄
2.UNION ALL:合併兩個SELECT語句產生的檢索結果,顯示重覆記錄
3.INTERSECT:只顯示兩個SELECT語句所產生的相同檢索結果
4.MINUS:顯示在一個SELECT檢索結果中存在而在另外一個SELECT檢索結果中不存在的記錄(相當於減號)
五、子查詢:SELECT查詢可以嵌套,理論上可以無數層地嵌套子查詢
1.單行子查詢:使用=符號進行匹配運算
2.多行子查詢:使用IN(...)進行匹配運算
3.多列子查詢:
SELECT column(s) FROM table_1
WHERE (column_1, column_2)
IN (SELECT column_3, column_4 FROM table_2)
Chpt 7
一、表間數據轉換
1.檢索-單表插入:INSERT INTO table_name (SELECT statement);
將SELECT statement生成的查詢結果插入到table_name所指定的表中
2.檢索-多表插入
(1) 無條件:
INSERT ALL
INTO first_table_name VALUES (first_column_name, … last_column_name)
…
INTO last_table_name VALUES (first_column_name, … last_column_name)
SELECT statement;
將SELECT statement生成的查詢結果插入到各個表中
(2) 有條件:
INSERT ALL
WHEN first_condition THEN INTO first_table [VALUES(column_list)]
…
WHEN last_condition THEN INTO last_table [VALUES(column_list)]
SELECT statement;
將SELECT statement生成的查詢結果經過每個condition二次篩選後再插入到各個表中
3.記錄MERGE:將更新和插入結合起來,插入表中沒有的記錄,更新表中已有的記錄
MERGE INTO main_table
USING change_table
ON (main_table.primary_key = change_table.primary_key)
WHEN MATCHED THEN
UPDATE SET main_table.first_column = change_table.first_column
…
main_table.last_column = change_table.last_column
WHEN NOT MATCHED THEN
INSERT (first_column, … last_column)
VALUES (change_table.first_column, … change_table.last_column);
4.檢索-創建新表:CREATE TABLE new_table_name AS SELECT statement;
創建新表,並將檢索結果作為新表的數據
二、改變表名:RENAME old_table_name TO new_table_name;
三、改變表結構
1.添加列:ALTER TABLE table_name ADD new_column_name datatype [NOT NULL];
2.改變列名:
ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name;
3.刪除列:ALTER TABLE table_name DROP COLUMN column_name;
4.改變列數據類型:ALTER TABLE table_name MODIFY column_name new_datatype;
四、視圖(VIEW)
1.定義:定義經常使用的查詢,將它保存到Oracle資料庫中,並且允許通過名稱進行調用(類似於表)。當用戶選擇視圖中的記錄時,Oracle執行保存在視圖中的查詢。
2.創建視圖:
CREATE OR REPLACE VIEW view_name AS
SELECT statement;
OR REPLACE的作用在於當存在同名視圖時,用新視圖覆蓋同名視圖
3.刪除視圖:DROP VIEW view_name;
4.TOP N分析:顯示前N條記錄
SELECT * FROM (SELECTstatement) WHERE ROWNUM <= number_of_records_you_want;
五、序列(SEQUENCE)
1.定義:計數器,在插入記錄時,通過使用序列可以確保為每個插入的記錄分配唯一序號
2.創建序列:
CREATE SEQUENCE sequence_name
[INCREMENT BY increment_quantity]
[START WITH starting_value]
[MAXVALUE highest_value]
[MINVALUE lowest_value]
[CYCLE];
3.運用序列
(1)當前序號:sequence_name.curral
(2)下一個值:sequence_name.nextval
4.修改現有序列
ALTER SEQUENCE sequence_name
[INCREMENT BY increment_quantity]
[MAXVALUE highest_value | NOMAXVALUE]
[MINVALUE lowest_value | NOMINIVALUE]
[CYCLE | NOCYCLE];
5.刪除序列
DROP SEQUENCE sequence_name;
六、同義詞
1.定義:可以使用不同於實際名稱的某個名稱引用Oracle對象
2.創建同義詞:CREATE [PUBLIC] SYNONYM synonym_name FOR object_name;
3.刪除同義詞:DROP [PUBLIC] SYNONYM synonym_name;
Chapt 8、Chpt 9 PL/SQL編程
一、基本塊:是構成PL/SQL程式的單位,存儲過程、存儲函數、觸發器、匿名塊都是由基本塊構成,由五部分構成。
1.規範部分:定義了基本塊的名稱,參數列表以及返回類型等信息。匿名塊沒有規範部分。
2.聲明部分:匿名塊以及標記塊以關鍵字DECLARE開始,過程與函數以IS開始。定義了基本塊要用的變數,游標,記錄類型,異常等。在塊嵌套時,子塊需要在此定義。這個部分所定義的各個成員,只能作為本塊以及子塊內局部使用的成員(相當於塊內局部變數)。
3.執行部分:以關鍵字BEGIN開始。包含此塊具體要執行的命令語句。執行部分可包含以下控制結構:
(1) IF語句:
IF condition_1 THEN
actions_1;
[ELSEIF condition_2 THEN
actions_2;]
…
[ELSE
actions_last;]
END IF;
(2) 迴圈語句
a. LOOP迴圈:
<<loop_name>>
LOOP
statements;
EXIT loop_name [WHEN exit_condition_expression];
statements;
END LOOP;
b. WHILE迴圈:
WHILE while_condition_expression
LOOP
statements;
END LOOP;
c. FOR迴圈:
FOR counter IN [REVERSE] lower_bound … upper_bound
LOOP
statements;
END LOOP;
4.異常部分:以關鍵字EXCEPTION開始。在程式執行過程中碰到使程式無法繼續執行的錯誤稱為異常。格式如下:
EXCEPTION
WHEN exception_name_1
THEN actions to take when this exception occurs
WHEN exception_name_2
THEN actions to take when this exception occurs
5.結束部分:過程與函數的結束部分為END proc_or_func_name,過程需要載最後添加“;”號,而匿名塊則只有END語句
二、複合數據類型—記錄類型
1.定義:記錄是基本數據類型的集合,隱藏了多個數據的複雜性。以record_name.field_name的形式對其中欄位進行訪問。可以將它理解為類似於C的structure結構或Java的POJO類,實質上就是PL/SQL自己的OR映射。
3.類型:
(1) 基於表中一列:variable_name table_name.column_name%TYPE;
(2) 基於表:record_variable_name table_name%ROWTYPE;
(3) 基於游標:record_variable_name cursor_name%ROWTYPE;
(4) 用戶自定義:
a. 類型定義:TYPE record_type_name IS [RECORD]
(field_1_name field_1_type,
field_2_name field_2_type,
… );
b. 類型使用:record_variable_name record_type_name;
三、游標
1.定義:與一個檢索SQL語句捆綁,代表這個SQL執行後的結果集,是記錄的集合(List)。
2.顯式游標:具有名稱的游標
(1) 聲明:顯式游標在基本塊的聲明部分中聲明
CURSOR cursor_name [parameter1 datatype1, parameter2 datatype2, …]
[RETURN return_specification] IS
select_statement
[FOR UPDATE OF table_or_col1, table_or_col2, …];
其中parameter1, parameter2, …是用於SELECT語句中WHERE子句的參數;return_specification指定了游標採用哪種記錄類型,若不指定,則自動創建基於游標的匿名記錄類型;table_or_col名稱必須來自於游標SELECT語句中使用的表名或列名,FOR UPDATE命令鎖定SELECT語句選擇的行,直到關閉游標才解除鎖定。
(2) 游標屬性:指示游標的狀態
a. cursor_name%ISOPEN:檢查游標是否打開
b. cursor_name%ROWCOUNT:游標SELECT語句所返回的行數
c. cursor_name%FOUND:檢查游標中是否還存在記錄沒有取出
d. cursor_name%NOTFOUND:與FOUND屬性相反
(3) 游標操作
a. 打開游標:OPEN cursor_name;
打開游標時就會自動執行SELECT語句,將結果填充到指定記錄類型或匿名記錄類型中
b. 取得記錄:FETCH cursor_name INTO record_var_or_list_of_var;
從游標的記錄列表中取出一條記錄,放到指定的記錄變數(record_var)或變數列表(list_of_var)中去,並刪除這條記錄,從空游標中讀取記錄將會重覆讀取最後一條已經讀取的記錄,而且不會報錯,故在取記錄前必須用FOUND或NOTFOUND屬性判定游標是否為空。
c. 關閉游標:CLOSE cursor_name;
關閉游標的同時還將釋放游標打開時所占用的所有系統資源
(4) 游標FOR迴圈:
FOR cursor_record IN cursor_nameLOOP
statements;
END LOOP;
迴圈地從游標中取出一條記錄,賦值給record_name指定的記錄變數中,直至記錄取完。
(5) WHERE CURRENT OF:
當打開游標進行更新或刪除所選擇的行時使用,相當於取得當前這行的檢索條件,用於找到需要進行更新或刪除操作的行。
3.隱式游標:只能用於只返回一條記錄的SELECT語句,若有多條記錄則報錯
SELECT column(s) INTO record_var_or_list_of_var FROM table(s) WHERE condition(s);
四、變數與常量
1.聲明變數:必須在基本塊的聲明部分聲明
variable_name data_type [[NOT NULL] := default_value_expression]; 或
variable_name data_type [[NOT NULL] DEFAULT default_value_expression];
2.聲明常量:必須在基本塊的聲明部分聲明,常量必須賦予一個值且不能改變
variable_name data_type CONSTANT := constant_value_expression;
3.變數賦值
(1) variable_name := expression;
(2) 函數或過程的參數傳遞
(3) 顯式游標取記錄
(4) 隱式游標取記錄
五、異常處理
1.定義:異常是出現某個特殊問題時激活的錯誤狀況。當出現異常時,在提出異常的語句部分終止該代碼的執行過程,並且將控制轉移到基本塊的異常處理部分。如果該基本塊沒有處理這個異常的部分,異常將會被拋至外層基本塊,如果外層基本塊還是沒有處理該異常的部分則繼續向上拋。如果到最後還是沒有得到處理,則系統會報告有未處理的異常錯誤。
2.異常種類
(1) 系統定義異常:系統內部定義的異常,有錯誤代碼。
(2) 自定義異常:用戶可以創建自己的異常條件和名稱,在基本塊的聲明部分定義
exception_name EXCEPTION;
3.發出異常:RAISE exception_name;
六、計時器:可用於計算語句命令消耗的時間
TIMING START;
statements;
TIMING STOP;
七、存儲過程(Stored Procedure)
1.定義:為一組用PL/SQL語言編寫的動作。調用某個過程時,它執行自身包含的動作。由於該過程存儲在資料庫中,因此稱為“存儲過程”。過程由基本塊組成。
2.規範部分:
CREATE PROCEDURE [OR REPLACE]
procedure_name (parameter1 [IN/OUT/IN OUT] datatype1[:= default_value], …)
其中OR REPLACE表示這個過程可以覆蓋系統中已經存在的同名過程;
parameter [IN/OUT/IN OUT] datatype是調用過程時需要的參數,若不需要參數,則用procedure_name()或procedure_name的形式;
IN表示調用過程時可以把實參傳遞給這個形參;OUT表示調用過程時可以使這個形參充當返回值;IN OUT表示這個參數既可以傳入值也可以傳出值;參數列表中的數據類型不可以包括尺寸規範;default_value為形參的預設值
3.其它部分與基本塊所述相同
4.過程的調用方法
(1) EXECUTE procedure_name (parameter_list);
(2) BEGIN
procedure_name (parameter_list);
END;
/
parameter_list的說明:
a. 若形參帶有預設值,且預設值形參位於形參列表結尾,那麼調用時就不必指定最後幾個形參的值,實參列表的順序與形參列表相同。
b. 若預設值形參不是處於形參列表的最後位置,或者希望明確指定哪個形參使用哪個實參,那麼可以實參列表中用指定符號進行參數捆綁:formal_param => actual_param
八、存儲函數(Stored Function)
1.定義:與存儲過程類似,不同之處在於存儲函數只有一個返回值,可以用於表達式中。
2.規範部分:
CREATE FUNCTION [OR REPLACE]
function_name (parameter1 datatype1[:= default_value], …) RETURN datatype
3.其它都與存儲過程相同
九、觸發器(Trigger)
1.定義:一種PL/SQL過程,當觸發器定義的某些時間發生時,它就自動執行。與過程與函數不同點在於:不可以在代碼中調用觸發器;沒有參數列表。觸發器也是由基本塊組成。
2.創建觸發器:
CREATE [OR REPLACE] TRIGGER trigger_name fire_time trigger_event
ON table_name
[WHEN trigger_restriction]
[FOR EACH ROW]
[DECLARE declarations]
BIGIN statements
[EXCEPTION WHEN exception_name THEN …]
END trigger_name;
(1) fire_time指定何時激活觸發器。若為BEFORE,則在對觸發事件影響的記錄進行約束檢查之前執行觸發器;若為AFTER,則在對觸發事件和所有約束檢查處理完畢後執行觸發器。
(2) trigger_event為觸發事件,可以是INSERT、UPDATE、DELETE,可以用OR將多個不同的觸發事件結合在一起,使用UPDATE時可以指定列表:UPDATE OF column1, …
(3) trigger_restriction為觸發器執行時必須符合的一個或多個條件,大多數是被影響的記錄新舊狀態的對比。
(4) FOR EACH ROW為觸發語句影響的每條記錄執行觸發器,也就是說若觸發語句影響了N條記錄,那麼會對這N條記錄分別執行觸發器。
(5) 在處理語句中,可以使用:OLD訪問舊記錄,使用:NEW訪問新記錄;但在trigger_restriction中使用OLD與NEW,沒有前置冒號。
3.刪除觸發器:DROP TRIGGER trigger_name;
4.註意事項
a. INSERT只能使用:NEW以及NEW
UPDATE可以使用:NEW以及NEW或:OLD以及OLD
DELETE只能使用:OLD以及OLD
b. 觸發器不能使用ROLLBACK、COMMIT和SAVEPOINT,也就是不能進行事務處理
c. 可以對相同的事件定義多個觸發器,但觸發器執行順序不能確定
十、PL/SQL包
1.定義:可以將函數、過程、記錄類型和游標打包,以隱藏具體實現的信息。
2.創建包的規範:
CREATE PACKAGE package_name IS
[variable_and_type_declarations]
[cursor_specifications]
[function_and_procedure_declarations]
END [package_name];
包規範中的聲明部分包括主體中使用的函數、過程、異常、游標、變數和常量的聲明。包規範中給出的變數稱為“包變數”,只有在首次訪問該包時才對它們進行初始化。
3.創建包的主體:
CREATE OR REPLACE PACKAGE BODY package_name IS
[local_declarations]
[full_cursor_definitions]
[full_function_and_procedure_definitions]
END [package_name];
包主體包括規範部分中聲明的所有游標、函數和過程的完整定義(不帶CREATE OR REPLACE)。對包中內容進行調用時,Oracle將該包載入記憶體,直到用戶撤銷與資料庫德連接時才釋放記憶體。
4.訪問:使用container.contained的形式訪問包中的資源
原文出處: 考研幫