亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Oracle XQuery查詢、構(gòu)建和轉(zhuǎn)換XML

瀏覽:103日期:2023-11-21 11:59:59
在 Oracle 數(shù)據(jù)庫 10g 第 2 版中,Oracle 引入了一個與該數(shù)據(jù)庫集成的全功能自帶 XQuery 引擎,該引擎可用于完成與開發(fā)支持 XML 的應(yīng)用程序相關(guān)的各種任務(wù)。XQuery 是一種用于處理 XML 數(shù)據(jù)模型的查詢語言,它實際上可操作任何類型的可用 XML 表達的數(shù)據(jù)。盡管 Oracle XQuery 實施使您可以使用數(shù)據(jù)庫數(shù)據(jù)和外部數(shù)據(jù)源,但在處理數(shù)據(jù)庫中存儲的結(jié)構(gòu)化數(shù)據(jù)方面,Oracle XML DB 通??梢燥@著提高性能。 本文提供的示例不僅演示了在什么場合下以及如何使用 XQuery 查詢、構(gòu)建和轉(zhuǎn)換 XML,而且還演示了如何監(jiān)控和分析 XQuery 表達式的性能執(zhí)行,從而找到更高效的方法來處理同一工作負載。 基于關(guān)系數(shù)據(jù)構(gòu)建 XML在需要的情況下(例如,向 Web 服務(wù)發(fā)送結(jié)果),您可能要基于關(guān)系數(shù)據(jù)構(gòu)建 XML。要在 Oracle 數(shù)據(jù)庫 10g 第 2 版之前的版本中完成此任務(wù),通常需要使用 SQL/XML 生成函數(shù),如 XMLElement、XMLForest 和 XMLAgg()。在 Oracle 數(shù)據(jù)庫 10 g 第 2 版中,XQuery 將比這些函數(shù)更為高效。具體而言,在 XQuery 表達式內(nèi)部使用 ora:view XQuery 函數(shù),您可以查詢現(xiàn)有的關(guān)系表或視圖以及即時構(gòu)建 XML,從而不必通過關(guān)系數(shù)據(jù)顯式創(chuàng)建 XML 視圖。列表 1 中的 PL/SQL 代碼演示了如何使用 ora:view 基于示例數(shù)據(jù)庫模式 HR 的默認員工關(guān)系表中存儲的數(shù)據(jù)構(gòu)建 XML 文檔。 列表 1:使用 ora:view 基于關(guān)系數(shù)據(jù)創(chuàng)建 XMLBEGINIF(DBMS_XDB.CREATEFOLDER('/public/employees')) THENDBMS_OUTPUT.PUT_LINE('Folder is created');ELSEDBMS_OUTPUT.PUT_LINE('Cannot create folder');END IF;COMMIT;END;/DECLAREXMLdoc XMLType;BEGINSELECT XMLQuery('for $j in 1return ( {for $i in ora:view('HR', 'employees')/ROWwhere $i/EMPLOYEE_ID <= 102return ({xs:string($i/EMPLOYEE_ID)}{xs:string($i/LAST_NAME)}{xs:integer($i/SALARY)} )} )'RETURNING CONTENT) INTO XMLdoc FROM DUAL;IF(DBMS_XDB.CREATERESOURCE('/public/employees/employees.xml', XMLdoc)) THENDBMS_OUTPUT.PUT_LINE('Resource is created');ELSEDBMS_OUTPUT.PUT_LINE('Cannot create resource');END IF;COMMIT;END;/在列表 1 中的第一個 PL/SQL 過程中,您只是在 XML 信息庫中創(chuàng)建了一個新文件夾。在該信息庫文件夾中,您隨后將存儲此處顯示的第二個 PL/SQL 過程中創(chuàng)建的 XML 文檔。第二個 PL/SQL 過程首先發(fā)出 SELECT 語句,該語句使用 XMLQuery SQL 函數(shù)基于關(guān)系數(shù)據(jù)構(gòu)建 XML。對于 XQuery 表達式(XMLQuery 在此處將其用作參數(shù))而言,請注重嵌套的 FLWOR 表達街惺褂玫?ora:view XQuery 函數(shù)。在該示例中,ora:view 獲取兩個輸入?yún)?shù),即“HR”和“employees”,它們指示該函數(shù)查詢屬于 HR 數(shù)據(jù)庫模式的員工表。因此,ora:view 將返回一個表示 HR.employees 表行的員工 XML 文檔序列。但為了節(jié)省結(jié)果文檔中的空間,只將前三個員工記錄傳遞給結(jié)果序列。這是通過在 FLWOR 表達式的 where 子句中指定 $i/EMPLOYEE_ID <= 102 而實現(xiàn)的。請注重 FLWOR 表達式的 return 子句中使用的 xs:string() 和 xs:integer() XQuery 類型表達式。實際上,此處使用的這兩個 XQuery 表達式不僅將 XML 節(jié)點值轉(zhuǎn)換為相應(yīng)的類型,而且還將提取這些節(jié)點值。隨后,生成的員工 XML 文檔作為 employees.xml 保存到之前在列表 1 中另一個 PL/SQL 過程中創(chuàng)建的 /public/employees XML 信息庫文件夾。要確保此操作已完成,可執(zhí)行以下查詢:SELECT XMLQuery('for $i in fn:doc('/public/employees/employees.xml')return;$i'RETURNING CONTENT) AS RESULT FROM DUAL;該查詢應(yīng)生成以下輸出:100King24000101Kochhar17000102De Haan17000在以上 XQuery 中,fn:doc XQuery 函數(shù)用于訪問 Oracle XML DB 信息庫中存儲的單個 XML 文檔。但假如要處理一些具有相同或相似結(jié)構(gòu)的 XML 文檔(存儲在同一 XML 信息庫文件夾中),應(yīng)該怎么做?這種情況下,另一個用于處理 XML 信息庫資源的 XQuery 函數(shù)(即 fn:collection)可能會派上用場。本文稍后將介紹幾個有關(guān)如何使用 fn:collection XQuery 函數(shù)的示例。 查詢 XMLType 數(shù)據(jù)XQuery 使您可以操作基于 XML 模式以及非基于模式的數(shù)據(jù)。以下示例演示了如何使用 XMLTable 函數(shù)從 OE 演示數(shù)據(jù)庫模式中查詢基于 PurchaseOrder XML 模式的 XMLType 表。 SELECT ttab.COLUMN_VALUE AS OrderTotal FROM purchaseorder,XMLTable('for $i in /PurchaseOrderwhere $i/User = 'EABEL'return;{$i/Reference}{fn:sum(for $j in $i/LineItems/LineItem/Partreturn ($j/@Quantity*$j/@UnitPrice))}'PASSING OBJECT_VALUE) ttab;在以上示例中,您在 XMLTable 函數(shù)的 PASSING 子句中使用 OBJECT_VALUE 虛擬列將 purchaseorder 表作為上下文項傳遞給此處使用的 XQuery 表達式。XQuery 表達式計算用戶 EABEL 請求的每個購買訂單的總計,并為處理的每個訂單生成一個 OrderTotal XML 元素。要訪問生成的 XML,請使用 SELECT 列表中的 COLUMN_VALUE 虛擬列。最終的輸出應(yīng)如下所示:ORDERTOTAL-------------------------------------------------------------EABEL-20021009123338324PDT1328.05EABEL-20021009123335791PDT2067.15EABEL-20021009123336251PDT289.6EABEL-20021009123336382PDT928.92要獲得相同的最終結(jié)果,可以改用 XMLQuery 函數(shù)。但假如將上一個示例中使用的 XQuery 表達式參數(shù)傳遞給 XMLQuery(如下所示):SELECT XMLQuery('for $i in /PurchaseOrderwhere $i/User eq 'EABEL'return;{$i/Reference}{fn:sum(for $j in $i/LineItems/LineItem/Partreturn ($j/@Quantity*$j/@UnitPrice))}'PASSING OBJECT_VALUERETURNING CONTENT)FROM purchaseorder;則 XQuery 表達式返回的空序列將與 purchaseorder 表聯(lián)接,從而包含在查詢總結(jié)果集中。實際上,這意味著輸出將不僅包含為用戶 EABEL 請求的訂單生成的 OrderTotal 元素,而且還包含為 purchaseorder 表中存儲的所有其他訂單生成的空行(默認情況下,purchaseorder 表包含 132 行)。從結(jié)果集中排除空行的方法之一是在 SELECT 語句的 WHERE 子句中使用 existsNode SQL 函數(shù),而不是在 XQuery 表達式中使用 WHERE 子句,如下所示: SELECT XMLQuery('for $i in /PurchaseOrderreturn;{$i/Reference}{fn:sum(for $j in $i/LineItems/LineItem/Partreturn ($j/@Quantity*$j/@UnitPrice))}'PASSING OBJECT_VALUERETURNING CONTENT) AS ordertotalFROM purchaseorderWHERE existsNode(OBJECT_VALUE, '/PurchaseOrder[User = 'EABEL']') = 1;以上查詢與本部分開頭的 XMLTable 示例生成相同的輸出。 查詢 Oracle XML DB 信息庫中的 XML 數(shù)據(jù)為訪問 Oracle XML DB 信息庫中存儲的 XML 數(shù)據(jù),Oracle XQuery 引入了 fn:doc 和 fn:collection XQuery 函數(shù)。使用 fn:doc,您可以查詢 XML 信息庫中存儲的單個 XML 文檔,而 fn:collection 使您可以訪問同一信息庫文件夾中存儲的多個 XML 文檔。 正如本文之前(參閱使用關(guān)系數(shù)據(jù)構(gòu)建 XML部分)介紹的示例所演示,使用 fn:doc 非常簡單直接。它獲取表示信息庫文件資源 (URI) 的字符串并返回該 URI 指向的文檔。要了解 fn:collection XQuery 函數(shù)的作用,同一文件夾中至少應(yīng)有兩個信息庫文件。假如已經(jīng)運行了列表 1 中的代碼,則已經(jīng)創(chuàng)建了 /public/employees 信息庫文件夾并在其中存儲了 employees.xml 文件。因此,您將需要在該文件夾中至少再創(chuàng)建一個 XML 文件,然后才能試用 fn:collection。列表 2 中的 PL/SQL 代碼基于 SCOTT/TIGER 演示數(shù)據(jù)庫模式的 dept 和 emp 表存儲的關(guān)系數(shù)據(jù)構(gòu)建 XML,然后將生成的 XML 文檔作為 acc_dept.xml 保存到 /public/employees 信息庫文件夾。要運行列表 2 中的 PL/SQL 過程,請確保以 SCOTT/TIGER 的身份登錄。 列表 2:基于關(guān)系數(shù)據(jù)構(gòu)建 XML 并將其保存到 XML 信息庫 DECLAREXMLdoc XMLType;BEGINSELECT XMLQuery('for $j in ora:view('SCOTT', 'dept')/ROWwhere $j/DEPTNO = 10return ( {$j/DEPTNO,$j/DNAME} {for $i in ora:view('SCOTT', 'emp')/ROWwhere $i/DEPTNO = $j/DEPTNOreturn ({$i/EMPNO,$i/ENAME,$i/SAL})} )'RETURNING CONTENT) INTO XMLdoc FROM DUAL;IF(DBMS_XDB.CREATERESOURCE('/public/employees/acc_dept.xml', XMLdoc)) THENDBMS_OUTPUT.PUT_LINE('Resource is created');ELSEDBMS_OUTPUT.PUT_LINE('Cannot create resource');END IF;COMMIT;END;/此時,/public/employees 信息庫文件夾應(yīng)包含兩個文件:acc_dept.xml(由列表 2 中的 PL/SQL 代碼生成)和 employees.xml 文件(由列表 1 中的代碼生成)。由于這些 XML 文檔存儲在同一信息庫文件夾中,因此可以使用 fn:collection 函數(shù)訪問兩個 XML 文檔中存儲的員工信息。然而,盡管這些 XML 文檔均包含員工 XML 元素(這些元素實際上具有相同結(jié)構(gòu)?,?XML 文檔本身的結(jié)構(gòu)迥然不同。在 employees.xml 中,文檔根元素為 EMPLOYEES,而 acc_dept.xml 將 DEPARTMENT 用作根元素。要解決此問題,可以通過 XQuery 使用 XPath // 構(gòu)造,從而導(dǎo)航到 XML 文檔中的某個節(jié)點,而不必指定該節(jié)點的確切路徑。以下示例演示了如何在 XQuery 表達式中使用 XPath // 構(gòu)造: SELECT XMLQuery('for $i in fn:collection('/public/employees')//EMPLOYEEwhere $i/SAL >= 5000order by $i/ENAMEreturn;$i'RETURNING CONTENT) FROM DUAL;該構(gòu)造應(yīng)生成以下輸出: 102De Haan170007839KING5000100King24000101Kochhar17000您可以看到,以上輸出包含從 employees.xml 和 acc_dept.xml 中獲取的員工 XML 元素,這些元素表示薪酬大于或等于 5,000 美元的員工。 將 XML 分解為關(guān)系數(shù)據(jù)假如應(yīng)用程序處理關(guān)系數(shù)據(jù)而非 XML,而您需要訪問的數(shù)據(jù)以 XML 格式存儲,則將 XML 分解為關(guān)系數(shù)據(jù)可能會非常有用。繼續(xù)進行上一部分的示例,您可以使用 SQL 函數(shù) XMLTable 將員工 XML 元素分解為虛擬表的單個列,如下所示: SELECT emps.empno,emps.ename, emps.sal FROM XMLTable('for $i in fn:collection('/public/employees')//EMPLOYEEwhere $i/SAL >= 5000return;$i'COLUMNS empno NUMBER;;;;PATH '/EMPLOYEE/EMPNO',ename VARCHAR2(30) PATH '/EMPLOYEE/ENAME',salNUMBER;;;;PATH '/EMPLOYEE/SAL') emps;該查詢將生成以下輸出: EMPNO ENAME SAL----- -------------- ----------7839 KING 5000100 King;;;;;24000101 Kochhar;;17000102 De Haan;;17000查詢外部數(shù)據(jù)源使用 XQuery,可以基于 XML 數(shù)據(jù)以及可以用 XML 表示的非 XML 數(shù)據(jù)生成 XML 文檔,無論其位置如何:無論是存儲在數(shù)據(jù)庫中、置于網(wǎng)站上、即時創(chuàng)建還是存儲在文件系統(tǒng)中。但要注重,Oracle XML DB 為針對數(shù)據(jù)庫中存儲的數(shù)據(jù)進行的 XML 操作提供了非常高的性能和可伸縮性。因此,假如您能夠完全控制所處理的數(shù)據(jù),則最好將它移動到數(shù)據(jù)庫中。 正如您從前面的示例中了解到的,在 Oracle XQuery 實施中,doc 和 collection XQuery 函數(shù)用于訪問 Oracle XML DB 信息庫中存儲的 XML 文檔。可以通過 XMLTable 和 XMLQuery SQL 函數(shù)中的 PASSING 子句動態(tài)綁定外部數(shù)據(jù)源??紤]以下示例。假設(shè)您的公司要為那些致力于 XQ 項目的員工支付獎金。因此,財務(wù)部發(fā)布了 empsbonus.xml 文件,其中包含有資格獲得獎金的員工列表以及該列表中輸入的每個員工的獎金數(shù)額。empsbonus.xml 文件可能如下所示: 10012001011000在實際情況中,以上的 XML 文件可能置于網(wǎng)站上(因此可以通過互聯(lián)網(wǎng)獲得)、以文件形式存儲在本地文件系統(tǒng)中,或以文件資源形式存儲在 Oracle XML DB 信息庫中。就本示例而言,該文件位于網(wǎng)站上。為簡單起見,可以在目錄(Web 服務(wù)器在其中存儲可從 Web 看到的文檔)中創(chuàng)建一個員工文件夾,然后在該文件夾中插入 empsbonus.xml 文件,以便可以通過以下 URL 訪問 empsbonus.xml 文件: http://localhost/employees/empsbonus.xml接下來,假設(shè)您需要基于 empsbonus.xml 文檔中存儲的數(shù)據(jù)創(chuàng)建一個報表。在該報表中,您可能不但要包含列表中顯示的獎金數(shù)額以及每個員工的員工 ID,還要包含他/她的全名。因此,可以首先使用以下查詢生成一個新的 XML 文檔(假設(shè)您以 HR/HR 的身份連接): SELECT XMLQuery('for $k in 1return ( {for $i in ora:view('employees')/ROW,$j in $emps/EMPLOYEES/EMPLOYEEwhere $i/EMPLOYEE_ID = $j/EMPNOreturn ({xs:string($i/EMPLOYEE_ID)}{xs:string(fn:concat($i/FIRST_NAME, ' ', $i/LAST_NAME))}{xs:integer($j/BONUS)})} )'PASSING xmlparse (document httpuritype('http://localhost/employees/empsbonus.xml').getCLOB()) as 'emps'RETURNING CONTENT).getStringVal() as RESULT FROM DUAL;以上查詢是一個有關(guān)如何使用 XQuery 基于 XML 和非 XML 數(shù)據(jù)(以不同的方式從不同的數(shù)據(jù)源中檢索)生成 XML 文檔的示例。具體而言,使用 ora:view() 函數(shù)訪問 HR 演示模式中的默認 employees 關(guān)系表,并使用 PASSING 子句中的 httpuritype() 函數(shù)借助于 HTTP 訪問 empsbonus.xml 文檔。然后,在 FLWOR 表達式的 return 子句中構(gòu)建新的 XML 文檔。最后,將獲得以下 XML 文檔: 100Steven King1200101Neena Kochhar1000解決性能問題正如您從前面的部分中了解到的,XQuery 是一種用于查詢 Oracle 數(shù)據(jù)庫存儲的 XML 內(nèi)容的高效方法 - 無論您是處理本地存儲的 XMLType 數(shù)據(jù)還是查詢基于關(guān)系數(shù)據(jù)構(gòu)建的 XML 視圖。但根據(jù)對數(shù)據(jù)使用的存儲類型的不同,XQuery 表達式的執(zhí)行性能可能迥然不同。尤其是,Oracle XML DB 可以優(yōu)化基于由 ora:view 函數(shù)創(chuàng)建的 SQL/XML 視圖而構(gòu)建的 XQuery 表達式。對于 XMLType 表或列中存儲的 XML 數(shù)據(jù),只能對使用結(jié)構(gòu)化(對象-關(guān)系)存儲技術(shù)存儲的基于 XML 模式的 XMLType 數(shù)據(jù)進行 XQuery 優(yōu)化。 所選擇的存儲模型并非是影響 XQuery 表達式執(zhí)行性能的唯一因素。在某些情況下,XQuery 表達式本身的結(jié)構(gòu)也可能導(dǎo)致性能問題。要監(jiān)控 XQuery 表達式的性能,可以打印并檢查關(guān)聯(lián)的 EXPLAIN PLAN。在 SQL*Plus 中,只需設(shè)置 AUTOTRACE 系統(tǒng)變量,即可打印 SQL 優(yōu)化程序使用的執(zhí)行路徑。但要執(zhí)行該操作,請確保創(chuàng)建 PLUSTRACE 角色,然后將其授予連接到數(shù)據(jù)庫所使用的用戶。有關(guān)如何執(zhí)行此操作的信息,請參閱 Oracle 數(shù)據(jù)庫 10g 第 2 版 (10.2) 文檔中《SQL*Plus 用戶指南和參考》一書中的“調(diào)整 SQL*Plus”一章。以下示例演示了如何通過檢查 EXPLAIN PLAN 生成的執(zhí)行計劃來獲得好處。假設(shè)您已經(jīng)將 PLUSTRACE 角色授予默認用戶 OE,以 OE/OE 的身份登錄并運行以下查詢: SET AUTOTRACE ON EXPLAINSELECT count(*)FROM oe.purchaseorder, XMLTable('for $i in /PurchaseOrder/Userwhere $i = 'CJOHNSON'return $i'PASSING OBJECT_VALUE) ptab;這將生成以下輸出: COUNT(*)---------- 9Execution Plan----------------------------------------------------Plan hash value: 4046110317---------------------------------------------------------------------------------------- Id Operation;Name; Rows; Bytes Cost (%CPU) Time;;---------------------------------------------------------------------------------------- 0 SELECT STATEMENT;;;;1 ; 226; 29; (0); 00:00:01 1 ; SORT AGGREGATE;;;;;1 ; 226; 2 NESTED LOOPS 10782 2379K 29; (0); 00:00:01 * 3 TABLE Access FULL; PURCHASEORDER;;1 ; 226; ;5; (0); 00:00:01 4 COLLECTION ITERATOR P XMLSEQUENCEFROMX;;;;;;;;Predicate Information (identified by operation id):---------------------------------------------------3 - filter(SYS_CHECKACL('ACLOID','OWNERID',xmltype('...您可能對為以上查詢生成的執(zhí)行計劃并不滿足。尤其是,所處理的行數(shù)可能非常大。由于 SQL 調(diào)整的主要目標(biāo)是避免訪問對結(jié)果沒有任何影響的行,因此可能要繼續(xù)調(diào)整查詢以優(yōu)化性能。對查詢中包含的 XPath 表達式進行重新建模后,可以再次重試它,如下所示: SELECT count(*)FROM oe.purchaseorder, XMLTable('for $i in /PurchaseOrderwhere $i/User = 'CJOHNSON'return $i/User'PASSING OBJECT_VALUE) ptab;這次,輸出應(yīng)如下所示: COUNT(*)---------- 9Execution Plan---------------------------------------------------Plan hash value: 3411896580---------------------------------------------------------------------------------------- Id Operation;Name; Rows; Bytes Cost (%CPU) Time;;---------------------------------------------------------------------------------------- 0 SELECT STATEMENT;;;;1 29; 7(0); 00:00:01 1 ; SORT AGGREGATE;;;;;1 29; 2 NESTED LOOPS ;;1 29; 7(0); 00:00:01 3 ;FAST DUAL ;;1 ;;;;2(0); 00:00:01 * 4 ;TABLE ACCESS FULL PURCHASEORDER;;1 29; 5(0); 00:00:01 Predicate Information (identified by operation id):---------------------------------------------------4 - filter('PURCHASEORDER'.'SYS_NC00022$'='CJOHNSON' ANDSYS_CHECKACL('ACLOID','OWNERID',xmltype('...您可以看到,以上顯示的查詢生成相同的最終結(jié)果,但它們的執(zhí)行計劃并不相同。查看最后一個示例中的 XQuery 表達式,您可能會注重到它迭代頂層 PurchaseOrder 元素,其中的每個 PurchaseOrder 元素都表示基于 PurchaseOrder XMLType 模式的表中的一行。這意味著實際上重寫 XQuery 表達式,以迭帶基礎(chǔ)對象表(用于存儲分解的 PurchaseOrder 文檔)中的行。與查詢要迭代不表示基礎(chǔ)表中的單個行的 XML 元素相比,該方法的性能更好一些。 但在某些情況下,很難發(fā)現(xiàn) XQuery 表達式的哪個構(gòu)造將使某些查詢的性能更好。這就是為什么最好在開發(fā)階段使用調(diào)整工具的原因。 將動態(tài)變量綁定到 XQuery 表達式另一種可以顯著提高 XQuery 表達式執(zhí)行性能的技術(shù)是使用綁定動態(tài)變量。使用綁定變量(而不是將變量串聯(lián)為字符串)可以使 Oracle 重用 SQL 語句,從而減少分析開銷并顯著提高應(yīng)用程序的性能??梢栽?XMLQuery 和 XMLTable SQL 函數(shù)中使用 PASSING 子句將動態(tài)變量綁定到 XQuery 表達式。該技術(shù)使您可以根據(jù)客戶端代碼中計算的參數(shù)動態(tài)生成 XML。列表 3 中的示例演示了如何在從 PHP 腳本執(zhí)行的 XQuery 查詢中使用綁定變量。 列表 3:使用綁定變量
標(biāo)簽: Oracle 數(shù)據(jù)庫
主站蜘蛛池模板: 国产免费福利视频 | 欧美一区二区三区国产精品 | 国产精品v一区二区三区 | 午夜国产精品理论片久久影院 | 天堂mv亚洲mv在线播放9蜜 | 男人免费看片 | 国产成人久视频免费 | 一级毛片完整免费版 | 欧美精品久久久久久久影视 | 欧美成人做性视频在线播放 | 黄色网址你懂的 | 久久国产乱子 | 51精品视频免费国产专区 | 亚洲精品国产手机 | 国产影院在线观看 | 久久天天躁狠狠躁夜夜爽蜜月 | 最新国产大片高清视频 | 国产成人精品午夜免费 | 黄色激情视频网站 | 99re在线精品视频 | 无码中文字幕乱在线观看 | 国产一区二区三区免费在线视频 | 成人免费国产欧美日韩你懂的 | 精品国产一区二区三区在线 | a毛片免费 | 亚洲狠狠婷婷综合久久蜜桃 | 欧美成人免费全部色播 | 亚洲国产精品人久久 | 国产免费叼嘿在线观看 | 在线观看国产精美视频 | 亚洲系列在线 | 日本不卡毛片一二三四 | 亚洲欧美视频 | 黄色a∨| 天天影视综合网色综合国产 | 国产成人手机视频 | 国产三级在线观看免费 | a毛片在线免费观看 | 国产精品国产三级国产 | 999精品视频在线 | 国产一级精品高清一级毛片 |