日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

第七章 控制PL/SQL错误

發布時間:2025/3/20 数据库 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第七章 控制PL/SQL错误 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、錯誤控制一覽

在PL/SQL中,警告或錯誤被稱為異常。異常可以是內部(運行時系統)定義的或是用戶定義的。內部定義的案例包括除零操作和內存溢出等。一些常見的內部異常都有一個預定義的名字,如ZERO_DIVIDE和STORAGE_ERROR等。對于其它的內部異常,我們可以手動為它們命名。

我們可以在PL/SQL塊、子程序或包的聲明部分自定義異常。例如,我們可以定義一個名為insufficient_funds的異常來標示帳戶透支的情況。與內部異常不同的是,用戶自定義異常必須有一個名字。

錯誤發生時,異常就會被拋出。也就是說,正常的執行語句會被終止,控制權被轉到PL/SQL塊的異常控制部分或子程序的異常控制部分。內部異常會由運行時系統隱式地拋出,而用戶定義異常必須顯式地用RAISE語句拋出,RAISE語句也可以拋出預定義異常。

為了控制被拋出的異常,我們需要單獨編寫被稱為"exception handler"的異常控制程序。異常控制程序運行后,當前塊就會停止執行,封閉塊繼續執行下一條語句。如果沒有封閉塊,控制權會直接交給主環境。

下例中,我們為一家股票代碼(Ticker Symbol)為XYZ的公司計算并保存市盈率(price-to-earning)。如果公司的收入為零,預定義異常ZERO_DIVIDE就會被拋出。這將導致正常的執行被終止,控制權被交給異常控制程序。可選的OTHERS處理器可以捕獲所有的未命名異常。

DECLARE
??pe_ratio???NUMBER?(3,?1);
BEGIN
??SELECT?price?/?earnings
????INTO?pe_ratio
????FROM?stocks
???WHERE?symbol?=?'XYZ';???--?might?cause?division-by-zero?error
??INSERT?INTO?stats?(symbol,?ratio)
???????VALUES?('XYZ',?pe_ratio);
??COMMIT;
EXCEPTION???--?exception?handlers?begin
??WHEN?ZERO_DIVIDE?THEN???--?handles?'division?by?zero'?error
????INSERT?INTO?stats?(symbol,?ratio)
?????????VALUES?('XYZ',?NULL);
????COMMIT;
????...
??WHEN?OTHERS?THEN???--?handles?all?other?errors
????ROLLBACK;
END;???--?exception?handlers?and?block?end?here

上面的例子演示了異常控制,但對于INSERT語句的使用就有些低效了。使用下面的語句就要好一些:

INSERT?INTO?stats?(symbol,?ratio)
??SELECT?symbol,?DECODE?(earnings,?0,?NULL,?price?/?earnings)
????FROM?stocks
???WHERE?symbol?=?'XYZ';

在下面這個例子中,子查詢為INSERT語句提供了數據。如果earnings是零的話,函數DECODE就會返回空,否則DECODE就會返回price與earnings的比值。

二、異常的優點

使用異常來控制錯誤有幾個優點。如果沒有異常控制的話,每次執行一條語句,我們都必須進行錯誤檢查:

BEGIN
??SELECT?...
????--?check?for?’no?data?found’?error
??SELECT?...
????--?check?for?’no?data?found’?error
??SELECT?...
????--?check?for?’no?data?found’?error

錯誤處理和正常的處理內容界限不明顯,導致代碼混亂。如果我們不編寫錯誤檢查代碼,一個錯誤就可能引起其它錯誤,有時還可能是一些無關錯誤。

但有了異常后,我們就能很方便的控制錯誤,而且不需要編寫多個檢查代碼:

BEGIN
??SELECT?...
??SELECT?...
??SELECT?...
??...
EXCEPTION
??WHEN?NO_DATA_FOUND?THEN?--?catches?all?'no?data?found'?errors

異常能把錯誤控制程序單獨分離出來,改善可讀性,主要的算法不會受到錯誤恢復算法影響。異常還可以提高可靠性。我們不需要在每一個可能出現錯誤的地方編寫錯誤檢查代碼了,只要在PL/SQL塊中添加一個異常控制代碼即可。這樣,如果有異常被拋出,我們就可以確保它能夠被捕獲并處理。

三、預定義PL/SQL異常

當我們的PL/SQL程序與Oracle規則相沖突或超過系統相關(system-dependent)的限制時,內部異常就會被拋出。每個Oracle錯誤都有一個錯誤編號,但異常只能按名稱捕獲,然后被處理。所以,PL/SQL把一些常見Oracle錯誤定義為異常。例如,如果SELECT INTO語句查詢不到數據時,PL/SQL就會拋出預定義異常NO_DATA_FOUND。

要控制其它Oracle異常,我們可以使用OTHERS處理器。函數SQLCODE和SQLERRM在OTHERS處理器中特別有用,因為它們能返回Oracle錯誤編號和消息。另外,我們還可以使用編譯指示(pragma)EXCEPTION_INIT把一個異常名稱和一個Oracle錯誤編號關聯起來。PL/SQL在STANDARD包中聲明了全局預定義異常。所以,我們不需要自己聲明它們。我們可以為下面列表中命名的預定義異常編寫處理程序:

異常Oracle錯誤號SQLCODE值
ACCESS_INTO_NULLORA-06530-6530
CASE_NOT_FOUNDORA-06592-6592
COLLECTION_IS_NULLORA-06531-6531
CURSOR_ALREADY_OPENORA-06511-6511
DUP_VAL_ON_INDEXORA-00001-1
INVALID_CURSORORA-01001-1001
INVALID_NUMBERORA-01722-1722
LOGIN_DENIEDORA-01017-1017
NO_DATA_FOUNDORA-01403100
NOT_LOGGED_ONORA-01012-1012
PROGRAM_ERRORORA-06501-6501
ROWTYPE_MISMATCHORA-06504-6504
SELF_IS_NULLORA-30625-30625
STORAGE_ERRORORA-06500-6500
SUBSCRIPT_BEYOND_COUNTORA-06533-6533
SUBSCRIPT_OUTSIDE_LIMITORA-06532-6532
SYS_INVALID_ROWIDORA-01410-1410
TIMEOUT_ON_RESOURCEORA-00051-51
TOO_MANY_ROWSORA-01422-1422
VALUE_ERRORORA-06502-6502
ZERO_DIVIDEORA-01476-1476

預定義異常的簡要描述:

異常拋出時機
ACCESS_INTO_NULL程序嘗試為一個未初始化(自動賦為null)對象的屬性賦值。
CASE_NOT_FOUNDCASE語句中沒有任何WHEN子句滿足條件,并且沒有編寫ELSE子句。
COLLECTION_IS_NULL程序嘗試調用一個未初始化(自動賦為null)嵌套表或變長數組的集合方法(不包括EXISTS),或者是程序嘗試為一個未初始化嵌套表或變長數組的元素賦值。
CURSOR_ALREADY_OPEN程序嘗試打開一個已經打開的游標。一個游標在重新打開之前必須關閉。一個游標FOR循環會自動打開它所引用的游標。所以,我們的程序不能在循環內部打開游標。
DUP_VAL_ON_INDEX程序嘗試向一個有著唯一約束條件的數據庫字段中保存重復值。
INVALID_CURSOR程序嘗試操作一個不合法的游標,例如關閉一個未打開的游標。
INVALID_NUMBER在一個SQL語句中,由于字符串并不代表一個有效的數字,導致字符串向數字轉換時會發生錯誤。(在過程化語句中,會拋出異常VALUE_ERROR。)當FETCH語句的LIMIT子句表達式后面不是一個正數時,這個異常也會被拋出。
LOGIN_DENIED程序嘗試使用無效的用戶名和/或密碼來登錄Oracle。
NO_DATA_FOUNDSELECT INTO語句沒有返回數據,或者是我們的程序引用了一個嵌套表中被刪除了的元素或是索引表中未初始化的元素。SQL聚合函數,如AVG和SUM,總是能返回一個值或空。所以,一個調用聚合函數的SELECT INTO語句從來不會拋出NO_DATA_FOUND異常。FETCH語句最終會取不到數據,當這種情況發生時,不會有異常拋出的。
NOT_LOGGED_ON程序沒有連接到Oracle就要調用數據庫。
PROGRAM_ERRORPL/SQL程序發生內部錯誤。
ROWTYPE_MISMATCH賦值語句中使用的主游標變量和PL/SQL游標變量的類型不兼容。例如,當一個打開的主游標變量傳遞到一個存儲子程序時,實參的返回類型和形參的必須一致。
SELF_IS_NULL程序嘗試調用一個空實例的MEMBER方法。也就是內置參數SELF(它總是第一個傳遞到MEMBER方法的參數)是空。
STORAGE_ERRORPL/SQL運行時內存溢出或內存不足。
SUBSCRIPT_BEYOND_COUNT程序引用一個嵌套表或變長數組元素,但使用的下標索引超過嵌套表或變長數組元素總個數。
SUBSCRIPT_OUTSIDE_LIMIT程序引用一個嵌套表或變長數組,但使用的下標索引不在合法的范圍內(如-1)。
SYS_INVALID_ROWID從字符串向ROWID轉換發生錯誤,因為字符串并不代表一個有效的ROWID。
TIMEOUT_ON_RESOURCE當Oracle等待資源時,發生超時現象。
TOO_MANY_ROWSSELECT INTO語句返回多行數據。
VALUE_ERROR發生算術、轉換、截位或長度約束錯誤。例如,當我們的程序把一個字段的值放到一個字符變量中時,如果值的長度大于變量的長度,PL/SQL就會終止賦值操作并拋出異常VALUE_ERROR。在過程化語句中,如果字符串向數字轉換失敗,異常VALUE_ERROR就會被拋出。(在SQL語句中,異常INVALID_NUMBER會被拋出。)
ZERO_DIVIDE程序嘗試除以0。

四、自定義PL/SQL異常

PL/SQL允許我們定義自己的異常。與預定義異常不同的是,用戶自定義異常必須聲明,并且需要用RAISE語句顯式地拋出。

1、聲明PL/SQL異常

異常只能在PL/SQL塊、子程序或包的聲明部分聲明。下例中,我們聲明一個名為past_due的異常:

DECLARE
??past_due?EXCEPTION;

異常和變量的聲明是相似的。但是要記住,異常是一種錯誤情況(error condition),而不是數據項。與變量不同的是,異常不能出現在賦值語句或是SQL語句中。但是,變量的作用域規則也適用于異常。

2、PL/SQL異常的作用域規則

在同一個塊內,異常不能聲明兩次。但可以在不同的塊聲明相同的異常。

塊中聲明的異常對于當前塊來說是本地的,但對于當前塊的所有子塊來說是全局的。因為塊只能引用本地或全局的異常,所以封閉塊不能引用聲明在子塊中的異常。

如果我們在子塊中重新聲明了一個全局的異常,本地聲明的異常的優先級是要高于全局的。所以,子塊就不能引用全局的異常,除非全局異常在它的所在塊中用標簽作了標記,這種情況下可以使用下面的語法來引用全局異常:

block_label.exception_name

下例中演示了作用范圍規則:

DECLARE
??past_due???EXCEPTION;
??acct_num???NUMBER;
BEGIN
??DECLARE???--?sub-block?begins
????past_due???EXCEPTION;???--?this?declaration?prevails
????acct_num???NUMBER;
??BEGIN
????...
????IF?...?THEN
??????RAISE?past_due;???--?this?is?not?handled
????END?IF;
??END;???--?sub-block?ends
EXCEPTION
??WHEN?past_due?THEN???--?does?not?handle?RAISEd?exception
????...
END;

上例中的封閉塊并不能捕獲拋出來的異常,因為在子塊中聲明的past_due優先級要高于封閉塊聲明的異常。雖然它們的名字相同,但實際上是兩個不同的past_due異常,就像兩個acct_num變量只是共享著相同的名字一樣,實際上它們是完全不同的兩個變量。因此,RAISE語句和WHEN子句所引用的是不同的異常。如果想讓封閉塊能捕獲到子塊中的past_due異常,我們就必須從子塊中刪除聲明,或是在封閉塊中添加OTHERS處理器。

3、把PL/SQL異常與編號關聯:編譯指示EXCEPTION_INIT

要想控制沒有預定義名稱的錯誤(通常為 ORA- 消息),我們就必須使用OTHERS處理器或編譯指示EXCEPTION_INIT。編譯指示就是能在編譯期而非運行時進行處理的編譯指令。

在PL/SQL中,編譯指示EXCPTION_INIT能告訴編譯器把異常名稱和錯誤編號關聯起來。這就能讓我們按名稱來引用所有的內部異常,并為它編寫特定的處理程序。在我們看到的錯誤棧或是錯誤消息序列中,最頂層的就是我們能捕獲和處理的信息。

我們可以把編譯指示EXCEPTION_INIT寫在PL/SQL塊、子程序或包的聲明部分,語法如下:

PRAGMA?EXCEPTION_INIT(exception_name,?-Oracle_error_number);

其中exception_name是已經聲明過的異常名稱,Oracle_error_number是Oracle錯誤編號。編譯指示必須和異常聲明處于同一個聲明中,并且只能在異常聲明之后出現。如下例所示:

DECLARE
??deadlock_detected???EXCEPTION;
??PRAGMA?EXCEPTION_INIT?(deadlock_detected,?-60);
BEGIN
??...???--?Some?operation?that?causes?an?ORA-00060?error
EXCEPTION
??WHEN?deadlock_detected?THEN
????--?handle?the?error
????...
END;

4、自定我們自己的錯誤消息:過程RAISE_APPLICATION_ERROR

過程RAISE_APPLICATION_ERROR能幫助我們從存儲子程序中拋出用戶自定義的錯誤消息。這樣,我們就能把錯誤消息報告給應用程序而避免返回未捕獲異常。

調用RAISE_APPLICATION_ERROR的語法如下:

raise_application_error(error_number,?message[,?{TRUE?|?FALSE}]);

error_number是一個范圍在-20000至-20999之間的負整數,message是最大長度為2048字節的字符串。如果第三個可選參數為TRUE的話,錯誤就會被放到前面錯誤的棧頂。如果為FALSE(默認值),錯誤就會替代前面所有的錯誤。

RAISE_APPLICATION_ERROR是包DBMS_STANDARD的一部分,所以,我們對它的引用不需要添加限定修飾詞。

應用程序只能從一個正在執行的存儲子程序或方法中調用raise_application_error。在調用時,raise_application_error會結束子程序并把用戶定義的錯誤編號和消息返回給應用程序。錯誤編號和消息可以像其它的Oracle錯誤一樣被捕獲。

在下面的例子中,我們在雇員工資欄的內容為空的情況下調用raise_application_error:

CREATE?PROCEDURE?raise_salary?(emp_id?NUMBER,?amount?NUMBER)?AS
??curr_sal???NUMBER;
BEGIN
??SELECT?sal
????INTO?curr_sal
????FROM?emp
???WHERE?empno?=?emp_id;
??IF?curr_sal?IS?NULL?THEN
????/*?Issue?user-defined?error?message.?*/
????raise_application_error?(-20101,?'Salary?is?missing');
??ELSE
????UPDATE?emp
???????SET?sal?=?curr_sal?+?amount
?????WHERE?empno?=?emp_id;
??END?IF;
END?raise_salary;

調用程序會得到一個PL/SQL異常,它能在OTHERS處理器中使用錯誤報告函數SQLCODE和SQLERRM來進行處理。同樣,我們也可以使用編譯指示EXCEPTION_INIT把raise_application_error返回的錯誤編號映射到異常本身。如下面的Pro*C例子所示:

EXEC?SQL?EXECUTE
??/*?Execute?embedded?PL/SQL?block?using?host
??variables?my_emp_id?and?my_amount,?which?were
??assigned?values?in?the?host?environment.?*/

DECLARE
??null_salary???EXCEPTION;
??/*?Map?error?number?returned?by?raise_application_error
??to?user-defined?exception.?*/
??PRAGMA?EXCEPTION_INIT?(null_salary,?-20101);
BEGIN
??raise_salary?(:my_emp_id,?:my_amount);
EXCEPTION
??WHEN?null_salary?THEN
????INSERT?INTO?emp_audit
?????????VALUES?(:my_emp_id,?...);
END;

END-EXEC;

這項技術能讓調用程序在特定的異常處理程序中控制錯誤。

5、重新聲明預定義異常

請記住,PL/SQL把預定義的異常作為全局內容聲明在包STANDARD中,所以,我們沒有必要重新聲明它們。重新聲明預定義異常是錯誤的做法,因為我們的本地聲明會覆蓋掉全局聲明。例如,如果我們聲明了一個invalid_number,當PL/SQL拋出預定義異常INVALID_NUMBER時,我們為異常INVALID_NUMBER編寫的異常控制程序就無法正確地捕獲到它了。這種情況下,我們必須像下面這樣使用點標志來指定預定義異常:

EXCEPTION
??WHEN?INVALID_NUMBER?OR?STANDARD.INVALID_NUMBER?THEN
????--?handle?the?error
END;

五、如何拋出PL/SQL異常

內部異常會由運行時系統隱式地拋出,其中也包括使用編譯指示EXCEPTION_INIT與Oracle錯誤編號關聯起來的用戶自定義異常。但是,用戶自定義的異常就必須顯式地用RAISE語句拋出。

1、使用RAISE語句拋出異常

PL/SQL塊和子程序應該只在錯誤發生或無法完成正常程序處理的時候才拋出異常。下例中,我們用RAISE語句拋出一個用戶自定義的out_of_stack異常:

DECLARE
??out_of_stock?????EXCEPTION;
??number_on_hand???NUMBER?(4);
BEGIN
??...
??IF?number_on_hand?<?1?THEN
????RAISE?out_of_stock;
??END?IF;
EXCEPTION
??WHEN?out_of_stock?THEN
????--?handle?the?error
END;

我們也可以顯式地拋出預定義異常。這樣,為預定義異常編寫的處理程序也就能夠處理其它錯誤了,示例如下:

DECLARE
??acct_type???INTEGER?:=?7;
BEGIN
??IF?acct_type?NOT?IN?(1,?2,?3)?THEN
????RAISE?INVALID_NUMBER;???--?raise?predefined?exception
??END?IF;
EXCEPTION
??WHEN?INVALID_NUMBER?THEN
????ROLLBACK;
END;

六、PL/SQL異常的傳遞

異常被拋出時,如果PL/SQL在當前塊或子程序中沒有找到對應的異常控制程序,異常就會被繼續向上一級傳遞。也就是說異常會把它自身傳遞到后繼的封閉塊直到找到異常處理程序或是再也沒有可以搜索到的塊為止。在后一種情況下,PL/SQL會向主環境拋出一個未捕獲異常。

但是,異常是不能通過遠程過程調用(RPC)來傳遞的。因此,PL/SQL塊不能捕獲由遠程子程序拋出的異常。下面三幅圖演示了異常基本的傳遞規則。

異常可以跨作用域傳遞,也就是說,它能夠超越聲明它的塊的范圍而存在。如下例所示:

BEGIN
??...
??DECLARE???--?sub-block?begins
????past_due???EXCEPTION;
??BEGIN
????...
????IF?...?THEN
??????RAISE?past_due;
????END?IF;
??END;???--?sub-block?ends
EXCEPTION
??...
??WHEN?OTHERS?THEN
????ROLLBACK;
END;

因為異常past_due所在的塊并沒有專門針對它的處理程序,所以異常就被傳遞到封閉塊。但是,按照作用域規則,封閉塊是不能引用子塊聲明的異常。所以,只有OTHERS處理器才能捕獲到這個異常。如果沒有用戶定義異常的處理程序,調用這個程序就會得到下面的錯誤:

ORA-06510:?PL/SQL:?unhandled?user-defined?exception

七、重新拋出PL/SQL異常

有時我們需要重新拋出捕獲到異常,也就是說,我們想在本地處理之后再把它傳遞到封閉塊。比如,在異常發生的時候,我們可能需要回滾事務,然后在封閉塊中寫下錯誤日志。

要重新拋出異常,只要在本地處理程序中放置一個RAISE語句即可,示例如下:

DECLARE
??out_of_balance???EXCEPTION;
BEGIN
??...
??BEGIN???--?sub-block?begins
????...
????IF?...?THEN
??????RAISE?out_of_balance;???--?raise?the?exception
????END?IF;
??EXCEPTION
????WHEN?out_of_balance?THEN
??????--?handle?the?error
??????RAISE;???--?reraise?the?current?exception
??END;???--?sub-block?ends
EXCEPTION
??WHEN?out_of_balance?THEN
????--?handle?the?error?differently
????...
END;

如果在RAISE語句中省略了異常名稱——只允許在異常處理程序中這樣做——程序就會把當前的異常重新拋出。

八、處理PL/SQL異常

異常拋出時,PL/SQL塊或子程序的正常執行就會停止,控制權轉到塊或子程序的異常處理部分,語法如下:

EXCEPTION
??WHEN?exception_name1?THEN???--?handler
????sequence_of_statements1
??WHEN?exception_name2?THEN???--?another?handler
????sequence_of_statements2
????...
??WHEN?OTHERS?THEN???--?optional?handler
????sequence_of_statements3
END;

為捕獲拋出的異常,我們需要編寫異常處理程序。每個處理程序都由一個WHEN子句和語句序列組成。這些語句執行完畢后,塊或子程序就會結束,控制權不再返回異常被拋起的地方。換句話說,也就是我們不能再次返回異常發生的地方繼續執行我們的程序。

可選的OTHERS處理器總是塊或子程序的最后一個處理程序,它可以用于捕獲所有的未命名異常。因此,塊或子程序只能有一個OTHERS處理器。如下例所示,OTHERS處理器能夠保證所有的異常都會被控制:

EXCEPTION
??WHEN?...?THEN
????--?handle?the?error
??WHEN?...?THEN
????--?handle?the?error
??WHEN?OTHERS?THEN
????--?handle?all?other?errors
END;

如果我們想讓兩個或更多的異常執行同樣的語句序列,只需把異常名稱用關鍵字OR隔開,放在同一個WHEN子句中即可,如下例所示:

EXCEPTION
??WHEN?over_limit?OR?under_limit?OR?VALUE_ERROR?THEN
??--?handle?the?error

只要在WHEN子句的異常列表中有一項與被拋出異常相匹配,相關的語句序列就會被執行。關鍵字OTHERS不能出現在異常名稱列表中;它只能單獨使用。我們可以有任意數量的異常處理程序,而且每個處理程序都與一個異常列表及其對應的語句序列相關聯。但是,異常名稱只能在塊或子程序的異常處理部分出現一次。

變量作用范圍的規則在這里也同樣適用,所以我們可以在異常處理程序中引用本地或全局變量。但是,當游標FOR循環中有異常拋出時,游標就會在異常處理程序調用之前被隱式地關閉。因此,顯式游標的屬性值在異常處理程序中就不再可用了。

1、聲明中控制異常

如果在聲明時使用了錯誤的初始化表達式也有可能引發異常。例如,下面的聲明就是因常量credit_limit不能存儲超過999的數字而拋出了異常:

DECLARE
??credit_limit?CONSTANT?NUMBER(3)?:=?5000;???--?raises?an?exception
??BEGIN
??...
EXCEPTION
??WHEN?OTHERS?THEN???--?cannot?catch?the?exception
??...
END;

當前塊中的處理程序并不能捕獲到拋出的異常,這是因為聲明時拋出的異常會被立即傳遞到最近的封閉塊中去。

2、異常句柄中控制異常

在一個塊或子程序中,一次只能有一個異常被激活。所以,一個被異常處理程序拋出的異常會被立即傳遞到封閉塊,在那兒,封閉塊會為它查找新的處理程序。從那一刻起,異常傳遞才開始正常化。參考下面的例子:

EXCEPTION
??WHEN?INVALID_NUMBER?THEN
????INSERT?INTO?...???--?might?raise?DUP_VAL_ON_INDEX
??WHEN?DUP_VAL_ON_INDEX?THEN?...???--?cannot?catch?the?exception
END;

3、異常分支

GOTO語句不能跳轉到異常控制程序。同樣,GOTO語句也不能從異常控制程序跳轉到當前塊。例如,下面的GOTO語句就是非法的:

DECLARE
??pe_ratio???NUMBER?(3,?1);
BEGIN
??DELETE?FROM?stats
????????WHERE?symbol?=?'xyz';
??SELECT?price?/?NVL?(earnings,?0)
????INTO?pe_ratio
????FROM?stocks
???WHERE?symbol?=?'xyz';

??<<my_label>>
??INSERT?INTO?stats?(symbol,?ratio)
???????VALUES?('xyz',?pe_ratio);
EXCEPTION
??WHEN?ZERO_DIVIDE?THEN
????pe_ratio??:=?0;
????GOTO?my_label;???--?illegal?branch?into?current?block
END;

但是,GOTO語句可以從一個異常控制程序中跳轉到一個封閉塊。

4、獲取錯誤代號與消息:SQLCODE和SQLERRM

在異常處理程序中,我們可以使用內置函數SQLCODE和SQLERRM來查出到底發生了什么錯誤,并能夠獲取相關的錯誤信息。對于內部異常來說,SQLCODE會返回Oracle錯誤編號。SQLCODE返回的總是一個負數,除非發生的Oracle錯誤是沒有找到數據,這時返回的是+100。SQLERRM會返回對應的錯誤消息。消息是以Oracle錯誤編號開頭的。

如果我們沒有使用編譯指令EXCEPTION_INIT把異常與編號關聯的話,SQLCODE和SQLERRM就會分別返回+1和消息"User-Defined Exception"。Oracle錯誤消息最大長度是512個字符,其中包括錯誤編號、嵌套消息和具體表和字段的名稱。

如果沒有異常拋出,SQLCODE返回0,SQLERRM返回消息"ORA-0000: normal, successful completion"。

我們可以把錯誤編號傳遞給SQLERRM,讓它返回對應的錯誤消息。但是,一定要保證我們傳遞給SQLERRM的錯誤編號是負數。下例中,我們把一個正數傳遞給SQLERRM,結果就不是我們想要的那樣的了:

DECLARE
??err_msg???VARCHAR2(100);
BEGIN
??/*?Get?all?Oracle?error?messages.?*/
??FOR?err_num?IN?1?..?9999?LOOP
????err_msg????:=?SQLERRM(err_num);???--?wrong;?should?be?-err_num

????INSERT?INTO?ERRORS
?????????VALUES?(err_msg);
??END?LOOP;
END;

把正數傳給SQLERRM時,如果傳遞的是+100,返回的結果是"no data found",其他情況總是會返回消息"user-defined exception"。把0傳遞給SQLERRM,就會返回消息"normal, successful completion"。

我們不能直接在SQL語句中使用SQLCODE或SQLERRM。我們必須先把它們的值賦給本地變量,然后再在SQL中使用變量,如下例所示:

DECLARE
??err_num???NUMBER;
??err_msg???VARCHAR2(100);
BEGIN
??...
EXCEPTION
??WHEN?OTHERS?THEN
????err_num????:=?SQLCODE;
????err_msg????:=?SUBSTR(SQLERRM,?1,?100);

????INSERT?INTO?ERRORS
?????????VALUES?(err_num,?err_msg);
END;

字符串函數SUBSTR可以保證用SQLERRM為err_msg賦值時不會引起VALUE_ERROR異常。函數SQLCODE和SQLERRM在OTHERS異常處理程序中特別有用,因為它們能讓我們知道哪個內部異常被拋出。

注意:在使用編譯指示RESTRICT_REFERENCES判斷存儲函數的純度時,如果函數調用了SQLCODE和SQLERRM,我們就不能指定約束為WNPS和RNPS了。

5、捕獲未控制異常

記住,如果被拋出的異常找不到合適的異常控制程序,PL/SQL會向主環境拋出一個未捕獲的異常錯誤,然后由主環境決定如何處理。例如,在Oracle預編譯程序環境中,任何一個執行失敗的SQL語句或PL/SQL塊所涉及到的改動都會被回滾。

未捕獲也能影響到子程序。如果我們成功地從子程序中退出,PL/SQL就會把值賦給OUT參數。但是,如果我們因未捕獲異常而退出程序,PL/SQL就不會為OUT參數進行賦值。同樣,如果一個存儲子程序因異常而執行失敗,PL/SQL也不會回滾子程序所做的數據變化。

我們可以在每個PL/SQL程序的頂級使用OTHERS句柄來捕獲那些沒有被子程序捕捉到的異常。

九、PL/SQL錯誤控制技巧

這里,我們將學習三個提高程序靈活性的技巧。

1、模擬TRY..CATCH..塊

異常控制程序能讓我們在退出一個塊之前做一些恢復操作。但是在異常程序完成后,語句塊就會終止。我們不能從異常句柄再重新回到當前塊。例如,如果下面的SELECT INTO語句引起了ZERO_DIVIDE異常,我們就不能執行INSERT語句了:

DECLARE
??pe_ratio???NUMBER(3,?1);
BEGIN
??DELETE?FROM?stats
????????WHERE?symbol?=?'XYZ';

??SELECT?price?/?NVL(earnings,?0)
????INTO?pe_ratio
????FROM?stocks
???WHERE?symbol?=?'XYZ';

??INSERT?INTO?stats(symbol,?ratio)
???????VALUES?('XYZ',?pe_ratio);
EXCEPTION
??WHEN?ZERO_DIVIDE?THEN
????...
END;

其實我們可以控制某一條語句引起的異常,然后繼續下一條語句。只要把可能引起異常的語句放到它自己的子塊中,并編寫對應的異常控制程序。一旦在子塊中有錯誤發生,它的本地異常處理程序就能捕獲并處理異常。當子塊結束時,封閉塊程序會繼續執行緊接著的下一條語句。如下例:

DECLARE
??pe_ratio???NUMBER(3,?1);
BEGIN
??DELETE?FROM?stats
????????WHERE?symbol?=?'XYZ';

??BEGIN???--?sub-block?begins
????SELECT?price?/?NVL(earnings,?0)
??????INTO?pe_ratio
??????FROM?stocks
?????WHERE?symbol?=?'XYZ';
??EXCEPTION
????WHEN?ZERO_DIVIDE?THEN
??????pe_ratio????:=?0;
??END;???--?sub-block?ends

??INSERT?INTO?stats(symbol,?ratio)
???????VALUES?('XYZ',?pe_ratio);
EXCEPTION
??WHEN?OTHERS?THEN
????...
END;

在上面這個例子中,如果SELECT INTO語句拋出了ZERO_DIVIDE異常,本地異常處理程序就會捕捉到它并把pe_ratio賦值為0。當處理程序完成時,子塊也就終止,INSERT語句就會被執行。

2、反復執行的事務

異常發生后,我們也許還不想放棄我們事務,仍想重新嘗試一次。這項技術的實現方法就是:

  • 把事務裝入一個子塊中。
  • 把子塊放入一個循環,然后反復執行事務
  • 在開始事務之前標記一個保存點。如果事務執行成功的話,就提交事務并退出循環。如果事務執行失敗,控制權就會交給異常處理程序,事務回滾到保存點,然后重新嘗試執行事務。
  • 如下例所示。當異常處理程序完成時,子塊終止,控制權被交給外圍塊的LOOP語句,子塊再次重新開始執行。而且,我們還可以用FOR或WHILE語句來限制重做的次數。

    DECLARE
    ??NAME?????VARCHAR2(20);
    ??ans1?????VARCHAR2(3);
    ??ans2?????VARCHAR2(3);
    ??ans3?????VARCHAR2(3);
    ??suffix???NUMBER???????:=?1;
    BEGIN
    ??...
    ??LOOP???--?could?be?FOR?i?IN?1..10?LOOP?to?allow?ten?tries
    ????BEGIN???--?sub-block?begins
    ??????SAVEPOINT?start_transaction;???--?mark?a?savepoint

    ??????/*?Remove?rows?from?a?table?of?survey?results.?*/
    ??????DELETE?FROM?results
    ????????????WHERE?answer1?=?’no’;

    ??????/*?Add?a?survey?respondent’s?name?and?answers.?*/
    ??????INSERT?INTO?results
    ???????????VALUES?(NAME,?ans1,?ans2,?ans3);

    ??????--?raises?DUP_VAL_ON_INDEX?if?two?respondents?have?the?same?name
    ??????COMMIT;
    ??????EXIT;
    ????EXCEPTION
    ??????WHEN?DUP_VAL_ON_INDEX?THEN
    ????????ROLLBACK?TO?start_transaction;???--?undo?changes
    ????????suffix????:=?suffix?+?1;???--?try?to?fix?problem
    ????????NAME??????:=?NAME?||?TO_CHAR(suffix);
    ????END;???--?sub-block?ends
    ??END?LOOP;
    END;

    3、使用定位變量標記異常發生點

    只用一個異常句柄來捕獲一系列語句的話,可能無法知道到底是哪一條語句產生了錯誤:

    BEGIN
    ??SELECT?...
    ??SELECT?...
    EXCEPTION
    ??WHEN?NO_DATA_FOUND?THEN?...
    ??--?Which?SELECT?statement?caused?the?error?
    END;

    要想解決這個問題,我們可以使用一個定位變量來跟蹤執行語句,例如:

    DECLARE
    ??stmt?INTEGER?:=?1;???--?designates?1st?SELECT?statement
    BEGIN
    ??SELECT?...
    ??stmt?:=?2;???--?designates?2nd?SELECT?statement
    ??SELECT?...
    EXCEPTION
    ??WHEN?NO_DATA_FOUND?THEN
    ????INSERT?INTO?errors?VALUES?('Error?in?statement?'?||?stmt);
    END;

    轉載于:https://www.cnblogs.com/cxd4321/archive/2008/03/19/1113203.html

    總結

    以上是生活随笔為你收集整理的第七章 控制PL/SQL错误的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    成年人在线观看视频免费 | 五月婷婷视频在线 | 免费男女羞羞的视频网站中文字幕 | 黄色小说免费观看 | 久久久黄色免费网站 | 在线色吧 | 怡红院av久久久久久久 | 一区 二区 精品 | 成人作爱视频 | 成人97视频一区二区 | 国产精品久久久久久久久久久久久 | 久久久久久草 | 一级a毛片高清视频 | 91av久久| 亚洲国产手机在线 | 免费性网站 | 欧美一级片免费观看 | 97在线免费观看 | 黄色成人在线 | 国产精品专区一 | 日韩av不卡在线播放 | 91麻豆免费看 | 日韩免费视频播放 | 国产精品一区二区在线免费观看 | 亚洲欧美视频 | 久久久久久久99精品免费观看 | 激情视频免费在线 | 午夜手机电影 | 精品影院 | 一区二区三区在线不卡 | 午夜精品久久久 | 日韩av五月天| 国内精品福利视频 | 国产在线综合视频 | 超碰97在线资源 | 精品国产一区二区三区四区vr | 午夜av在线播放 | 中文字幕在线看视频国产中文版 | 国产第一二区 | 99热99热| 99久久综合国产精品二区 | 成人在线免费视频 | 日本系列中文字幕 | 性日韩欧美在线视频 | 国内精品久久久久影院一蜜桃 | 久久美女高清视频 | 涩涩网站在线播放 | 国产一级片免费视频 | 亚洲欧洲日韩 | 91麻豆精品国产91久久久使用方法 | 欧洲视频一区 | 日韩欧美高清免费 | 91片黄在线观看动漫 | 激情自拍av | 69国产精品视频 | 国产伦理久久精品久久久久_ | 久久久久伦理电影 | 日韩欧美在线不卡 | 日韩精品在线免费播放 | 碰天天操天天 | 日韩在线高清视频 | 国产视频久久久 | 国产黑丝一区二区三区 | 亚洲免费视频观看 | 韩国精品福利一区二区三区 | 日韩午夜电影 | 韩日精品在线观看 | 久草99 | 欧美精品久久天天躁 | 日韩最新中文字幕 | www视频在线免费观看 | 久久亚洲免费视频 | 97国产在线观看 | 亚洲精品视频在 | 在线视频福利 | 亚洲国产成人在线播放 | 免费男女羞羞的视频网站中文字幕 | 综合av在线| 国产区在线视频 | 激情视频在线观看网址 | 青青网视频 | 亚洲三级在线免费观看 | 日日夜夜天天久久 | 五月激情久久 | 久久久午夜精品理论片中文字幕 | 激情综合亚洲精品 | 97超碰人人网 | 亚洲最新视频在线播放 | 蜜桃视频成人在线观看 | 午夜av片 | 国产视频久久久 | 激情影院在线 | 国产一级免费片 | 91福利视频久久久久 | 久久久久久久久久伊人 | 成年性视频 | 国产精品美女久久久久久久久久久 | 精品一区二区在线免费观看 | 久久久国产精品麻豆 | 久久精品视频在线观看免费 | 在线观看91久久久久久 | 国产高清专区 | 91污污视频在线观看 | 色综合久久综合 | 日本精品久久久一区二区三区 | 在线亚洲人成电影网站色www | 天天色天天射天天综合网 | 91经典在线 | 日韩免费不卡视频 | 99久久99久久精品免费 | 综合激情网 | 亚洲无吗av | 91爱爱视频 | 97人人精品 | 日韩亚洲在线观看 | 91视频在线 | 天天操天天干天天爽 | 亚洲精品高清视频 | 国色天香第二季 | 久久九九九九 | 日韩中文字幕亚洲一区二区va在线 | 久久99久久99精品免视看婷婷 | 亚洲午夜久久久久久久久电影网 | 成 人 黄 色 片 在线播放 | 久久久久国产精品免费 | 97av视频 | 一级成人免费视频 | 国产精品99精品久久免费 | 国产精品国产自产拍高清av | 婷婷综合在线 | 国产第一页福利影院 | 安徽妇搡bbbb搡bbbb | 成人免费网站视频 | 日本中文字幕电影在线免费观看 | 91精品日韩 | 黄色成年 | 日本护士三级少妇三级999 | 日日夜夜狠狠操 | 日韩中文三级 | 亚洲视屏一区 | 中文字幕一区二区三区乱码在线 | 国产人成精品一区二区三 | 在线观看免费国产小视频 | 久久久精品电影 | 97av在线视频免费播放 | 五月婷婷,六月丁香 | 国产精品一区二区久久精品爱涩 | 韩日精品在线 | 国产最新在线视频 | av在线免费播放 | 免费看黄色91 | 久久99国产精品免费 | 91中文在线视频 | 99色网站 | 日本激情视频中文字幕 | 精品在线观看一区二区 | 日韩在线首页 | 日韩av片在线 | www.色的 | 亚洲色图美腿丝袜 | 日韩无在线 | 6080yy精品一区二区三区 | 久草在线最新免费 | 国产精品久久久毛片 | 综合久久久久久久久 | 在线91播放 | 久久天天躁狠狠躁亚洲综合公司 | 黄色成人在线 | 在线超碰av | www天天干 | 日本午夜在线观看 | 一区二区电影在线观看 | 97国产精品一区二区 | 欧美精品在线视频 | 深爱开心激情 | 91av视频导航 | 天天天操操操 | 日本久久视频 | 国产在线观看国语版免费 | 在线综合色 | 五月综合久久 | 国产啊v在线观看 | a视频在线观看 | 岛国精品一区二区 | 99精品久久久久 | 国产一区成人在线 | 久久第四色 | 日日摸日日添日日躁av | 毛片在线播放网址 | 午夜在线免费视频 | 欧美电影黄色 | 国产精品扒开做爽爽的视频 | 四虎影视成人 | 午夜国产福利在线 | av免费片 | 精品一区二区综合 | 久久99精品久久久久婷婷 | 免费a视频在线观看 | 国产精品字幕 | 久热免费在线 | 欧美在线你懂的 | 午夜视频免费在线观看 | 九色视频网 | 久久久久久久久久久久久久av | 久久久午夜剧场 | 久草在线看片 | 99久久激情 | 中文字幕一区二区三区在线观看 | 在线a亚洲视频播放在线观看 | 日日干天天操 | 欧美激情第一区 | 四虎最新域名 | 日韩av在线一区二区 | 国模精品在线 | 亚洲黄色成人av | aaaaaa毛片 | 中午字幕在线观看 | 国产色综合 | 永久精品视频 | 欧美一区二区三区特黄 | 尤物一区二区三区 | 在线播放91| 三上悠亚一区二区在线观看 | 久久另类小说 | 中文字幕日韩国产 | 国产精品久久久久久69 | 欧美一级爽| 高清日韩一区二区 | 少妇18xxxx性xxxx片 | 97超碰精品 | 黄色免费在线视频 | 在线播放精品一区二区三区 | 成人黄色中文字幕 | 国产精品1区2区3区在线观看 | 亚洲精品视频在线观看免费视频 | 在线免费国产 | 五月婷婷中文网 | 欧美成人h版 | 久久久久久久久毛片精品 | 九九九九色 | 中文字幕在线播放日韩 | 免费福利影院 | 国产色啪 | 一区二区三区播放 | 97人人爽 | 精品一区在线看 | 超碰在线99 | 亚洲综合色站 | 伊人国产在线观看 | 人人草在线视频 | 国产原创在线观看 | www.久久爱.cn| 欧美日韩国产在线一区 | 日韩影视在线观看 | 伊人国产在线播放 | 天天操夜夜干 | av免费试看 | 国产精彩视频一区二区 | 精品国产精品久久一区免费式 | 四虎欧美| 人人人爽 | av成人在线播放 | 黄色动态图xx | 999成人| 欧美成人在线免费 | h久久| av五月婷婷 | 成人av在线影视 | 国产精品久久久久久久毛片 | 六月婷色 | 看片在线亚洲 | 一区二区精品视频 | 综合天天色 | 色婷婷伊人 | 亚洲乱码精品久久久 | 999成人免费视频 | 日韩在线在线 | 亚洲激情在线播放 | 国内精品久久久精品电影院 | 久久久久免费电影 | 国产福利91精品一区 | 亚洲免费观看视频 | 亚洲精品国偷自产在线99热 | 91成品视频| 成人午夜免费福利 | 九色视频网 | 中文字幕国产一区二区 | 久久精品视频观看 | 久草在线视频网站 | 国产精品美女久久久久久久久 | 天天色图| 国产一级片免费视频 | 国产精品久久久久久久久久久久午夜 | 毛片一级免费一级 | 国产精品69av | 在线观看aa| 国产精品免费在线观看视频 | 天堂视频一区 | 激情婷婷综合网 | 中文字幕在线视频精品 | 黄色一级在线视频 | 久久精品96 | 亚洲黄色网络 | a黄色片 | 91在线中字| 欧美伦理一区二区三区 | 精品国产一区二区三区久久久蜜臀 | 久久国产亚洲视频 | 国产精品久久久久久吹潮天美传媒 | av蜜桃在线 | 国产精品3 | 久久久久免费网站 | 国产精品99久久久久久久久 | 精品在线播放视频 | 国产精品美女久久久久久2018 | 久久久久人人 | 国产精品va视频 | 亚洲精品99| 美女国产 | 五月婷婷一级片 | 中文字幕日本在线观看 | 一区二区视频在线观看免费 | 97网在线观看 | 天天射天天爽 | 91在线亚洲| 久久久精品福利视频 | 99精品乱码国产在线观看 | 国产一区二区精品久久91 | 国产高清在线a视频大全 | 又湿又紧又大又爽a视频国产 | 视频在线观看入口黄最新永久免费国产 | 又黄又刺激又爽的视频 | 色婷婷成人网 | 高清免费在线视频 | 少妇做爰k8经典 | 一区二区三区在线视频111 | 国产做a爱一级久久 | 99色网站| 国产精品久久久久久久电影 | 国产一区在线视频观看 | 九九视频热 | 99资源网 | 日本三级久久 | 96精品在线 | 四虎影视国产精品免费久久 | 国产精品久久久久久妇 | 精品资源在线 | 欧美乱大交 | 欧美日韩在线播放 | 久久免费黄色网址 | 国色综合 | 欧美黑人性猛交 | 手机在线看永久av片免费 | 视频一区二区在线观看 | 一区二区中文字幕在线观看 | 欧美另类69| 91亚洲永久精品 | 美女一级毛片视频 | 日韩av进入 | 在线免费观看国产 | av大全在线观看 | 亚洲视频999| 国产在线97 | www国产亚洲| 黄色特一级片 | 日韩精品一区二区免费 | 黄网站色成年免费观看 | 国产免费高清视频 | 狠狠撸电影 | 日韩高清在线看 | 久久综合偷偷噜噜噜色 | 亚洲成人精品av | 一区视频在线 | 久久国产精彩视频 | 天天操狠狠干 | 久久免费电影网 | 亚洲三级黄 | www.91av在线 | 国产视频精品在线 | 免费在线观看成人av | 成人久久久久久久久久 | 91日韩在线 | 国产又粗又猛又色又黄网站 | 99理论片| 日本视频高清 | 亚洲在线免费视频 | 日韩黄色大片在线观看 | 成全免费观看视频 | 人人视频网站 | 国产精品嫩草影院99网站 | 中文字幕亚洲精品在线观看 | 欧美伦理电影一区二区 | 五月天综合色 | 国产综合激情 | 久久综合狠狠 | 在线观看岛国av | 欧美资源在线观看 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 欧美日韩国产成人 | 久草线 | 国产打女人屁股调教97 | 我爱av激情网 | 国产精品99久久久久久小说 | 成人免费网站在线观看 | 国产超碰在线 | 国产黄a三级三级 | a视频免费 | 在线观看黄网站 | 色视频在线看 | 国产成人黄色av | 日韩午夜视频在线观看 | 久免费| 99久高清在线观看视频99精品热在线观看视频 | 国产成人精品综合久久久久99 | 国产高清一 | 欧美一区二区三区免费看 | 亚洲高清在线精品 | 免费国产黄线在线观看视频 | 国产精品一区二区在线看 | 嫩草av在线 | av观看免费在线 | 91亚洲免费 | 日韩黄色中文字幕 | 中文字幕资源网 国产 | 久久久99精品免费观看乱色 | 六月激情丁香 | 国产99区 | 天天躁日日躁狠狠 | 国产手机视频精品 | 久射网| 三三级黄色片之日韩 | 18久久久久 | 色免费在线 | 怡红院av| 欧美一级片免费 | 亚洲精色 | 五月天色综合 | 九9热这里真品2 | 国产精品手机看片 | 亚洲精品高清视频在线观看 | 91av视屏| 天天玩夜夜操 | 中文电影网 | 欧美日韩精品综合 | 国产 视频 久久 | 久久婷婷视频 | 97成人资源站 | 国产一级在线视频 | 98精品国产自产在线观看 | 欧美一区免费观看 | 丁香久久五月 | 免费一级特黄毛大片 | 91精品国产自产在线观看永久 | 丰满少妇高潮在线观看 | 中文字幕国产视频 | 国产成人av电影在线观看 | 高清国产一区 | 国产无区一区二区三麻豆 | 麻豆精品传媒视频 | 国产伦精品一区二区三区四区视频 | 亚洲理论影院 | 亚洲精品在线国产 | 午夜成人影视 | 国产精品99蜜臀久久不卡二区 | 国产成人一区二区三区免费看 | 色婷婷国产在线 | 丁香高清视频在线看看 | 91网免费观看| 国产福利在线免费观看 | 国内精品久久久久久中文字幕 | 国产精品久久久久久久久久东京 | 91一区啪爱嗯打偷拍欧美 | 在线亚洲人成电影网站色www | 九九久久久| 色窝资源| 中文字幕欧美三区 | 久久在线一区 | 中文字幕在线播放第一页 | 国产第一页精品 | 久久激情视频免费观看 | 日韩区欧美久久久无人区 | 在线观看福利网站 | 精品麻豆入口免费 | 黄色大片免费网站 | 91成品视频 | 美女在线观看av | 91大片成人网 | 99精品久久只有精品 | 久久精品一区二区三区国产主播 | 一区二区不卡高清 | 在线看日韩av | 国产区精品在线观看 | av天天在线观看 | 中文区中文字幕免费看 | 伊人久久电影网 | 亚洲黄色一级视频 | 亚洲国产中文在线观看 | a级片久久久 | 欧美日韩综合在线 | 国产美女免费看 | av免费片| 午夜精品福利在线 | 伊人春色电影网 | 超碰97人 | 日韩免费在线网站 | 国产精品美乳一区二区免费 | 久久av在线播放 | 黄色成人小视频 | 91色综合 | 超碰999 | 欧美精品久久久久久久久久丰满 | 激情久久久久久久久久久久久久久久 | 日韩精品久久久久久久电影99爱 | 亚洲精品大片www | 91丨九色丨丝袜 | 亚洲第一香蕉视频 | 日本 在线 视频 中文 有码 | 久久av观看| 999久久久久久久久6666 | a特级毛片| 丁香激情五月婷婷 | 玖玖视频精品 | 欧美一区二区免费在线观看 | 久久系列 | 美女视频黄免费 | 成人手机在线视频 | 最新av电影网站 | 色偷偷av男人天堂 | 国产xvideos免费视频播放 | 亚洲国产日韩在线 | 我爱av激情网 | 91九色视频观看 | 欧美贵妇性狂欢 | 中文视频在线 | av在线播放快速免费阴 | 久久国产精品免费观看 | 性色av一区二区三区在线观看 | 国产精品视屏 | 久久久久免费精品国产 | 色综合久久综合网 | 久久看片网 | 在线国产高清 | 在线免费观看一区二区三区 | 狠狠狠狠狠狠狠狠干 | 久久精品欧美一区 | 中文字幕有码在线观看 | 日韩特黄一级欧美毛片特黄 | 91精品视频一区 | 最新午夜电影 | 国产一二三在线视频 | 成人久久亚洲 | 国产一区视频导航 | 日本中文乱码卡一卡二新区 | 午夜色大片在线观看 | 亚洲在线网址 | 免费精品在线视频 | 五月婷婷激情六月 | 在线观看亚洲精品视频 | 免费看高清毛片 | 免费黄色在线播放 | 国内精品久久久久久久影视简单 | 在线免费观看国产 | 日日综合网 | 在线免费黄 | av品善网 | 日韩av进入| 国产福利中文字幕 | 狠狠操欧美 | 999久久久国产精品 高清av免费观看 | 日本99久久 | 精品国产一区二区三区免费 | 欧美精品久久久久久久免费 | 一区二区精品在线观看 | 在线观看精品黄av片免费 | 国产999免费视频 | 91传媒免费在线观看 | 色九九在线| 伊人色播 | 国产三级香港三韩国三级 | 日韩高清精品免费观看 | 久久精品电影网 | 黄色电影在线免费观看 | 久久99国产精品久久99 | 久久久久亚洲国产 | 欧美伦理一区二区 | 五月宗合网| 天天操天天草 | 色姑娘综合网 | 久久美女免费视频 | 69精品久久 | 国产精久久 | av在观看| 亚洲视频h | 精品视频www | 久久精品国产精品亚洲 | 久久久久久久久福利 | 亚洲精品国精品久久99热一 | 国产精品精品久久久久久 | 香蕉视频导航 | 青青草国产成人99久久 | 亚洲aⅴ一区二区三区 | 91视频在线 | 亚洲精选在线 | 国产精品mv | 国产一区二区在线视频观看 | 欧美大片www | 97热久久免费频精品99 | 最新日韩视频 | 色国产视频 | 国产精品视频全国免费观看 | 91av小视频 | 成人小视频在线 | 在线视频免费观看 | 欧美一二三视频 | 国产在线高清精品 | 色七七亚洲影院 | 国产在线观看免费av | av片免费播放 | 国产视频午夜 | 爱爱av在线 | 午夜在线免费观看 | 国产黄色免费 | 精品a在线 | 久久久福利视频 | 亚洲视频免费在线观看 | www视频免费在线观看 | 久久综合久久综合这里只有精品 | 在线观看韩日电影免费 | 日韩色视频在线观看 | 日日干视频 | 国产精品中文字幕av | 天天插狠狠干 | 久久成人精品电影 | 综合五月| 在线免费国产 | 美女黄频在线观看 | 国产91亚洲精品 | 6080yy午夜一二三区久久 | 成人黄色免费观看 | 欧美精品乱码久久久久久按摩 | 成人免费视频播放 | 日韩高清免费在线 | 美女网站视频免费都是黄 | 超碰伊人网 | 91精品国产自产在线观看 | 91av精品 | 日韩精品播放 | 中文在线字幕观看电影 | 久久久综合电影 | www.福利| 久操操| 99se视频在线观看 | 99热精品在线 | 一级性av| 99精彩视频在线观看免费 | 精品亚洲成人 | 久久爱992xxoo | 欧美日韩二三区 | 91香蕉国产在线观看软件 | 人人爽人人爽人人爽人人爽 | 国产区av在线 | 午夜精品一区二区三区在线 | 午夜美女网站 | 日韩精品一区二区三区中文字幕 | 欧美成年网站 | 日韩中文字幕第一页 | 九九亚洲精品 | 天天操综合网 | 日韩黄色在线观看 | 99视| 激情丁香婷婷 | 一级黄色免费 | 久久久久在线视频 | 国产精品女同一区二区三区久久夜 | 欧美精品免费一区二区 | 中文视频在线看 | 狠狠久久伊人 | 精品久久久国产 | av官网在线 | 手机看片中文字幕 | 97在线观看免费观看高清 | 亚洲永久精品视频 | 色婷五月天 | 97视频免费观看2区 亚洲视屏 | 亚洲国产成人久久综合 | 中文字幕乱偷在线 | 国产午夜精品免费一区二区三区视频 | 国产精品ⅴa有声小说 | av一级片网站| 国产精品乱看 | 免费观看www小视频的软件 | 91九色在线视频 | 国产亚洲精品成人av久久影院 | 国产一二区在线观看 | 久久99精品久久久久久 | 免费热情视频 | 婷婷色五 | 97超碰在线播放 | 亚洲视频分类 | 国产区久久 | 在线日本v二区不卡 | 久草久草久草久草 | 亚洲一区二区精品视频 | 中文字幕高清av | 欧美精品一二 | 免费日韩三级 | 久久黄色网址 | 免费观看一区 | 久久九九国产视频 | 99在线免费观看视频 | 91精品国产一区二区在线观看 | 波多野结衣视频网址 | 免费视频一级片 | 亚洲国产精品成人av | 96视频免费在线观看 | 激情网五月婷婷 | 欧美日韩一区二区在线观看 | 人人添人人澡人人澡人人人爽 | 中国美女一级看片 | 亚洲开心激情 | 国产精品刺激对白麻豆99 | 久久成人一区二区 | 国产中文字幕一区二区三区 | 国产成人精品一区二区三区网站观看 | 中文字幕在线播放第一页 | 国产精品视频线看 | 久草在线观看资源 | 天堂中文在线视频 | 亚洲激情国产精品 | 久久视频免费在线观看 | 日韩欧美在线中文字幕 | 久久区二区 | 国产五月婷| 天天躁天天躁天天躁婷 | 又黄又爽的免费高潮视频 | 天天激情综合网 | 国产伦理一区 | 国产护士av | 国产成人在线精品 | 久久精品男人的天堂 | 伊人五月天综合 | 日韩高清三区 | 美女福利视频网 | 久久在线观看 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 99久久精品国产一区 | 久久视频99 | 国产1区2 | 久久久.com| 中文资源在线观看 | 91精品天码美女少妇 | 国产资源网 | 九九在线视频免费观看 | 免费在线黄 | 国产精品一区免费在线观看 | 欧美性大战久久久久 | 国产在线不卡一区 | 黄色成年片 | 99久久这里只有精品 | 91亚色在线观看 | 免费视频一二三 | 麻豆免费视频网站 | 亚洲综合激情小说 | 成年人视频在线观看免费 | av福利电影 | 色综合久久五月天 | 色激情五月 | 日本老少交 | 天天干人人插 | 亚洲精品网站 | 天堂中文在线视频 | 亚洲精品国精品久久99热一 | 久久婷婷开心 | 激情综合网天天干 | av免费看av | 国产精品久久久久久久久免费看 | 免费国产在线精品 | 97色视频在线 | 字幕网av | 在线a视频| 午夜久久精品 | 98久9在线 | 免费 | 国产精品高清在线观看 | 一本一本久久a久久精品牛牛影视 | 免费看黄视频 | 欧美日高清视频 | 国产手机在线精品 | 国产在线观看午夜 | 日本不卡123| 国产精品成人自产拍在线观看 | 国产成人精品在线观看 | 久久精品一区八戒影视 | 亚洲成年人免费网站 | 伊人丁香 | 成人一级片视频 | 日韩中文字幕a | 在线亚洲欧美视频 | 国产成人精品综合 | 在线天堂视频 | 婷婷新五月 | 国产专区第一页 | 日韩在线电影 | 日日夜夜综合网 | 日韩大片在线免费观看 | 久久躁日日躁aaaaxxxx | 日韩精品一区二区三区高清免费 | 玖玖视频免费在线 | 中文字幕免费成人 | 国产精品久久嫩一区二区免费 | 一区二区理论片 | 安徽妇搡bbbb搡bbbb | 国产国产人免费人成免费视频 | 91插插插免费视频 | 日韩av黄| 天天干天天操av | 国产69久久久 | 激情av网址| 久久你懂得 | 亚洲精品国产精品乱码不99热 | 日韩在线观看中文 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 久久8精品 | 成人综合日日夜夜 | 久久成人毛片 | 色噜噜色噜噜 | 亚洲少妇自拍 | 国产精品一区专区欧美日韩 | 草草草影院 | 91探花国产综合在线精品 | 日韩中文字幕免费在线播放 | 狠狠干网站 | 免费成人av在线 | 精品视频123区在线观看 | 香蕉视频网站在线观看 | 毛片网站免费在线观看 | 久久久久久久久久久免费 | 午夜国产福利在线 | 亚洲精品美女在线 | 人人爱爱人人 | 二区三区在线 | 久久久久免费精品国产 | 国产 日韩 在线 亚洲 字幕 中文 | 99精品免费在线 | 国产精品午夜久久 | 亚洲成熟女人毛片在线 | 久久精品草 | 欧美最猛性xxx | 婷婷四房综合激情五月 | 黄色软件网站在线观看 | 3d黄动漫免费看 | 中文字幕资源在线 | 国产精品一区在线 | 麻豆精品在线视频 | 黄色av影视| 久久久国产一区二区三区四区小说 | 国产午夜精品一区二区三区欧美 | 欧美综合国产 | 精品美女在线观看 | 狠狠干狠狠操 | 久久久久久久久久久久av | 五月综合色婷婷 | 国内视频在线 | 91夫妻视频| 欧美日韩国产二区 | 久草在线免费看视频 | 国产偷在线 | 亚州国产视频 | 久久久久久视频 | 国产激情久久久 | 日本中文字幕视频 | 久久精品国产一区 | 97人人超碰在线 | 婷婷中文字幕 | av午夜电影 | 欧美一级电影在线观看 | 日韩av电影网站在线观看 | 日本一区二区不卡高清 | 九九国产精品视频 | 最近日本韩国中文字幕 | 91色网址 | 国产在线无 | 久久好看 | 黄色成人在线 | 97精品欧美91久久久久久 | 免费在线观看黄色网 | 久久在草| 欧洲精品视频一区二区 | 日韩系列在线 | 人人玩人人添人人澡97 | 亚洲精品在线一区二区三区 | 亚洲国产免费网站 | 日韩在线理论 | 激情婷婷六月 | 婷婷激情五月 | 成人精品一区二区三区中文字幕 | 国产美女在线精品免费观看 | 人人人爽 | 亚洲开心色 | 不卡的一区二区三区 | 日韩免费一区二区三区 | 国产精品久久久久久一区二区三区 | 人人舔人人插 | 玖玖在线观看视频 | 午夜视频在线观看一区二区三区 | 国产成人精品一区二区三区福利 | 欧美三级在线播放 | 久久黄色影视 | 69av久久| 日韩欧美视频在线免费观看 | 91av视频在线免费观看 | 日本aa在线 | 国产淫a| 少妇18xxxx性xxxx片 | 国产免费精彩视频 | 99爱视频在线观看 | 成人一级 | 91久久久国产精品 | 中文字幕视频网站 | 久久精品视 | 中文字幕 91 | 天天干天天摸天天操 | 在线成人免费电影 | 国产成人精品一二三区 | 成年人免费在线 | 麻豆91在线| 久久久久亚洲最大xxxx | 国产精品女人网站 | 99久久999久久久精玫瑰 | 精品一区二区在线免费观看 | 久久不卡国产精品一区二区 | 91九色蝌蚪视频在线 | 久草网视频 | 99操视频| 国产精品丝袜 | 国产中出在线观看 | 五月天精品视频 | 久久久久在线 | 9797在线看片亚洲精品 | 91精品国产网站 | 成人a视频片观看免费 | 在线精品一区二区 | 91中文字幕在线视频 | 日韩在线免费观看视频 | 成人精品视频 | 五月天婷婷免费视频 | 欧美精品久久久久久 | 91精品免费在线视频 | 免费视频一级片 | 国产99久久久国产精品成人免费 | 久久久国产精品人人片99精片欧美一 | www.久久久com | 免费三级网 | 久久综合影视 | 高清av中文在线字幕观看1 | 精品国产一区二区三区av性色 | 国产在线播放一区二区三区 | 亚洲激精日韩激精欧美精品 | 国产成人三级在线播放 | 久久精品免费播放 | 久久久久久视频 | 丝袜精品视频 | 成人国产精品免费 | 国产不卡免费av | 中文字幕在线播放av | 久av在线 | 日韩精品欧美专区 | 日本精品一区二区在线观看 | 成人免费网站视频 | 伊人色综合久久天天网 | 五月婷婷av在线 | 亚洲性视频| 国产色网 | 天天拍天天干 | 福利一区二区在线 | 中文字幕一区二区在线观看 | 最新av网址大全 | 香蕉网址 | 亚洲综合导航 | 免费精品人在线二线三线 | 国产午夜三级一区二区三桃花影视 | 超碰免费av| 国产一区在线视频 | 欧美在线1区 | 欧美性精品 | 久热久草在线 | 在线国产视频一区 | 国产精品日韩在线 | 久久97久久97精品免视看 | 日韩成人看片 | 精品久久久久久亚洲综合网 | 久久香蕉电影 | 973理论片235影院9 | 久久人人爽人人爽人人 | 亚洲精品免费观看视频 | 91精品推荐 | 99久e精品热线免费 99国产精品久久久久久久久久 | 午夜精品视频免费在线观看 | 九九在线视频免费观看 |