日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:348日期:2023-11-21 11:59:59
在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版中,Oracle 引入了一個(gè)與該數(shù)據(jù)庫(kù)集成的全功能自帶 XQuery 引擎,該引擎可用于完成與開(kāi)發(fā)支持 XML 的應(yīng)用程序相關(guān)的各種任務(wù)。XQuery 是一種用于處理 XML 數(shù)據(jù)模型的查詢語(yǔ)言,它實(shí)際上可操作任何類型的可用 XML 表達(dá)的數(shù)據(jù)。盡管 Oracle XQuery 實(shí)施使您可以使用數(shù)據(jù)庫(kù)數(shù)據(jù)和外部數(shù)據(jù)源,但在處理數(shù)據(jù)庫(kù)中存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù)方面,Oracle XML DB 通常可以顯著提高性能。 本文提供的示例不僅演示了在什么場(chǎng)合下以及如何使用 XQuery 查詢、構(gòu)建和轉(zhuǎn)換 XML,而且還演示了如何監(jiān)控和分析 XQuery 表達(dá)式的性能執(zhí)行,從而找到更高效的方法來(lái)處理同一工作負(fù)載。 基于關(guān)系數(shù)據(jù)構(gòu)建 XML在需要的情況下(例如,向 Web 服務(wù)發(fā)送結(jié)果),您可能要基于關(guān)系數(shù)據(jù)構(gòu)建 XML。要在 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版之前的版本中完成此任務(wù),通常需要使用 SQL/XML 生成函數(shù),如 XMLElement、XMLForest 和 XMLAgg()。在 Oracle 數(shù)據(jù)庫(kù) 10 g 第 2 版中,XQuery 將比這些函數(shù)更為高效。具體而言,在 XQuery 表達(dá)式內(nèi)部使用 ora:view XQuery 函數(shù),您可以查詢現(xiàn)有的關(guān)系表或視圖以及即時(shí)構(gòu)建 XML,從而不必通過(guò)關(guān)系數(shù)據(jù)顯式創(chuàng)建 XML 視圖。列表 1 中的 PL/SQL 代碼演示了如何使用 ora:view 基于示例數(shù)據(jù)庫(kù)模式 HR 的默認(rèn)員工關(guān)系表中存儲(chǔ)的數(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 中的第一個(gè) PL/SQL 過(guò)程中,您只是在 XML 信息庫(kù)中創(chuàng)建了一個(gè)新文件夾。在該信息庫(kù)文件夾中,您隨后將存儲(chǔ)此處顯示的第二個(gè) PL/SQL 過(guò)程中創(chuàng)建的 XML 文檔。第二個(gè) PL/SQL 過(guò)程首先發(fā)出 SELECT 語(yǔ)句,該語(yǔ)句使用 XMLQuery SQL 函數(shù)基于關(guān)系數(shù)據(jù)構(gòu)建 XML。對(duì)于 XQuery 表達(dá)式(XMLQuery 在此處將其用作參數(shù))而言,請(qǐng)注重嵌套的 FLWOR 表達(dá)街惺褂玫?ora:view XQuery 函數(shù)。在該示例中,ora:view 獲取兩個(gè)輸入?yún)?shù),即“HR”和“employees”,它們指示該函數(shù)查詢屬于 HR 數(shù)據(jù)庫(kù)模式的員工表。因此,ora:view 將返回一個(gè)表示 HR.employees 表行的員工 XML 文檔序列。但為了節(jié)省結(jié)果文檔中的空間,只將前三個(gè)員工記錄傳遞給結(jié)果序列。這是通過(guò)在 FLWOR 表達(dá)式的 where 子句中指定 $i/EMPLOYEE_ID <= 102 而實(shí)現(xiàn)的。請(qǐng)注重 FLWOR 表達(dá)式的 return 子句中使用的 xs:string() 和 xs:integer() XQuery 類型表達(dá)式。實(shí)際上,此處使用的這兩個(gè) XQuery 表達(dá)式不僅將 XML 節(jié)點(diǎn)值轉(zhuǎn)換為相應(yīng)的類型,而且還將提取這些節(jié)點(diǎn)值。隨后,生成的員工 XML 文檔作為 employees.xml 保存到之前在列表 1 中另一個(gè) PL/SQL 過(guò)程中創(chuàng)建的 /public/employees XML 信息庫(kù)文件夾。要確保此操作已完成,可執(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ù)用于訪問(wèn) Oracle XML DB 信息庫(kù)中存儲(chǔ)的單個(gè) XML 文檔。但假如要處理一些具有相同或相似結(jié)構(gòu)的 XML 文檔(存儲(chǔ)在同一 XML 信息庫(kù)文件夾中),應(yīng)該怎么做?這種情況下,另一個(gè)用于處理 XML 信息庫(kù)資源的 XQuery 函數(shù)(即 fn:collection)可能會(huì)派上用場(chǎng)。本文稍后將介紹幾個(gè)有關(guān)如何使用 fn:collection XQuery 函數(shù)的示例。 查詢 XMLType 數(shù)據(jù)XQuery 使您可以操作基于 XML 模式以及非基于模式的數(shù)據(jù)。以下示例演示了如何使用 XMLTable 函數(shù)從 OE 演示數(shù)據(jù)庫(kù)模式中查詢基于 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 表作為上下文項(xiàng)傳遞給此處使用的 XQuery 表達(dá)式。XQuery 表達(dá)式計(jì)算用戶 EABEL 請(qǐng)求的每個(gè)購(gòu)買訂單的總計(jì),并為處理的每個(gè)訂單生成一個(gè) OrderTotal XML 元素。要訪問(wèn)生成的 XML,請(qǐng)使用 SELECT 列表中的 COLUMN_VALUE 虛擬列。最終的輸出應(yīng)如下所示:ORDERTOTAL-------------------------------------------------------------EABEL-20021009123338324PDT1328.05EABEL-20021009123335791PDT2067.15EABEL-20021009123336251PDT289.6EABEL-20021009123336382PDT928.92要獲得相同的最終結(jié)果,可以改用 XMLQuery 函數(shù)。但假如將上一個(gè)示例中使用的 XQuery 表達(dá)式參數(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 表達(dá)式返回的空序列將與 purchaseorder 表聯(lián)接,從而包含在查詢總結(jié)果集中。實(shí)際上,這意味著輸出將不僅包含為用戶 EABEL 請(qǐng)求的訂單生成的 OrderTotal 元素,而且還包含為 purchaseorder 表中存儲(chǔ)的所有其他訂單生成的空行(默認(rèn)情況下,purchaseorder 表包含 132 行)。從結(jié)果集中排除空行的方法之一是在 SELECT 語(yǔ)句的 WHERE 子句中使用 existsNode SQL 函數(shù),而不是在 XQuery 表達(dá)式中使用 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;以上查詢與本部分開(kāi)頭的 XMLTable 示例生成相同的輸出。 查詢 Oracle XML DB 信息庫(kù)中的 XML 數(shù)據(jù)為訪問(wèn) Oracle XML DB 信息庫(kù)中存儲(chǔ)的 XML 數(shù)據(jù),Oracle XQuery 引入了 fn:doc 和 fn:collection XQuery 函數(shù)。使用 fn:doc,您可以查詢 XML 信息庫(kù)中存儲(chǔ)的單個(gè) XML 文檔,而 fn:collection 使您可以訪問(wèn)同一信息庫(kù)文件夾中存儲(chǔ)的多個(gè) XML 文檔。 正如本文之前(參閱使用關(guān)系數(shù)據(jù)構(gòu)建 XML部分)介紹的示例所演示,使用 fn:doc 非常簡(jiǎn)單直接。它獲取表示信息庫(kù)文件資源 (URI) 的字符串并返回該 URI 指向的文檔。要了解 fn:collection XQuery 函數(shù)的作用,同一文件夾中至少應(yīng)有兩個(gè)信息庫(kù)文件。假如已經(jīng)運(yùn)行了列表 1 中的代碼,則已經(jīng)創(chuàng)建了 /public/employees 信息庫(kù)文件夾并在其中存儲(chǔ)了 employees.xml 文件。因此,您將需要在該文件夾中至少再創(chuàng)建一個(gè) XML 文件,然后才能試用 fn:collection。列表 2 中的 PL/SQL 代碼基于 SCOTT/TIGER 演示數(shù)據(jù)庫(kù)模式的 dept 和 emp 表存儲(chǔ)的關(guān)系數(shù)據(jù)構(gòu)建 XML,然后將生成的 XML 文檔作為 acc_dept.xml 保存到 /public/employees 信息庫(kù)文件夾。要運(yùn)行列表 2 中的 PL/SQL 過(guò)程,請(qǐng)確保以 SCOTT/TIGER 的身份登錄。 列表 2:基于關(guān)系數(shù)據(jù)構(gòu)建 XML 并將其保存到 XML 信息庫(kù) 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;/此時(shí),/public/employees 信息庫(kù)文件夾應(yīng)包含兩個(gè)文件:acc_dept.xml(由列表 2 中的 PL/SQL 代碼生成)和 employees.xml 文件(由列表 1 中的代碼生成)。由于這些 XML 文檔存儲(chǔ)在同一信息庫(kù)文件夾中,因此可以使用 fn:collection 函數(shù)訪問(wèn)兩個(gè) XML 文檔中存儲(chǔ)的員工信息。然而,盡管這些 XML 文檔均包含員工 XML 元素(這些元素實(shí)際上具有相同結(jié)構(gòu)?XML 文檔本身的結(jié)構(gòu)迥然不同。在 employees.xml 中,文檔根元素為 EMPLOYEES,而 acc_dept.xml 將 DEPARTMENT 用作根元素。要解決此問(wèn)題,可以通過(guò) XQuery 使用 XPath // 構(gòu)造,從而導(dǎo)航到 XML 文檔中的某個(gè)節(jié)點(diǎn),而不必指定該節(jié)點(diǎn)的確切路徑。以下示例演示了如何在 XQuery 表達(dá)式中使用 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,而您需要訪問(wèn)的數(shù)據(jù)以 XML 格式存儲(chǔ),則將 XML 分解為關(guān)系數(shù)據(jù)可能會(huì)非常有用。繼續(xù)進(jìn)行上一部分的示例,您可以使用 SQL 函數(shù) XMLTable 將員工 XML 元素分解為虛擬表的單個(gè)列,如下所示: 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 文檔,無(wú)論其位置如何:無(wú)論是存儲(chǔ)在數(shù)據(jù)庫(kù)中、置于網(wǎng)站上、即時(shí)創(chuàng)建還是存儲(chǔ)在文件系統(tǒng)中。但要注重,Oracle XML DB 為針對(duì)數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)進(jìn)行的 XML 操作提供了非常高的性能和可伸縮性。因此,假如您能夠完全控制所處理的數(shù)據(jù),則最好將它移動(dòng)到數(shù)據(jù)庫(kù)中。 正如您從前面的示例中了解到的,在 Oracle XQuery 實(shí)施中,doc 和 collection XQuery 函數(shù)用于訪問(wèn) Oracle XML DB 信息庫(kù)中存儲(chǔ)的 XML 文檔。可以通過(guò) XMLTable 和 XMLQuery SQL 函數(shù)中的 PASSING 子句動(dòng)態(tài)綁定外部數(shù)據(jù)源。考慮以下示例。假設(shè)您的公司要為那些致力于 XQ 項(xiàng)目的員工支付獎(jiǎng)金。因此,財(cái)務(wù)部發(fā)布了 empsbonus.xml 文件,其中包含有資格獲得獎(jiǎng)金的員工列表以及該列表中輸入的每個(gè)員工的獎(jiǎng)金數(shù)額。empsbonus.xml 文件可能如下所示: 10012001011000在實(shí)際情況中,以上的 XML 文件可能置于網(wǎng)站上(因此可以通過(guò)互聯(lián)網(wǎng)獲得)、以文件形式存儲(chǔ)在本地文件系統(tǒng)中,或以文件資源形式存儲(chǔ)在 Oracle XML DB 信息庫(kù)中。就本示例而言,該文件位于網(wǎng)站上。為簡(jiǎn)單起見(jiàn),可以在目錄(Web 服務(wù)器在其中存儲(chǔ)可從 Web 看到的文檔)中創(chuàng)建一個(gè)員工文件夾,然后在該文件夾中插入 empsbonus.xml 文件,以便可以通過(guò)以下 URL 訪問(wèn) empsbonus.xml 文件: http://localhost/employees/empsbonus.xml接下來(lái),假設(shè)您需要基于 empsbonus.xml 文檔中存儲(chǔ)的數(shù)據(jù)創(chuàng)建一個(gè)報(bào)表。在該報(bào)表中,您可能不但要包含列表中顯示的獎(jiǎng)金數(shù)額以及每個(gè)員工的員工 ID,還要包含他/她的全名。因此,可以首先使用以下查詢生成一個(gè)新的 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;以上查詢是一個(gè)有關(guān)如何使用 XQuery 基于 XML 和非 XML 數(shù)據(jù)(以不同的方式從不同的數(shù)據(jù)源中檢索)生成 XML 文檔的示例。具體而言,使用 ora:view() 函數(shù)訪問(wèn) HR 演示模式中的默認(rèn) employees 關(guān)系表,并使用 PASSING 子句中的 httpuritype() 函數(shù)借助于 HTTP 訪問(wèn) empsbonus.xml 文檔。然后,在 FLWOR 表達(dá)式的 return 子句中構(gòu)建新的 XML 文檔。最后,將獲得以下 XML 文檔: 100Steven King1200101Neena Kochhar1000解決性能問(wèn)題正如您從前面的部分中了解到的,XQuery 是一種用于查詢 Oracle 數(shù)據(jù)庫(kù)存儲(chǔ)的 XML 內(nèi)容的高效方法 - 無(wú)論您是處理本地存儲(chǔ)的 XMLType 數(shù)據(jù)還是查詢基于關(guān)系數(shù)據(jù)構(gòu)建的 XML 視圖。但根據(jù)對(duì)數(shù)據(jù)使用的存儲(chǔ)類型的不同,XQuery 表達(dá)式的執(zhí)行性能可能迥然不同。尤其是,Oracle XML DB 可以優(yōu)化基于由 ora:view 函數(shù)創(chuàng)建的 SQL/XML 視圖而構(gòu)建的 XQuery 表達(dá)式。對(duì)于 XMLType 表或列中存儲(chǔ)的 XML 數(shù)據(jù),只能對(duì)使用結(jié)構(gòu)化(對(duì)象-關(guān)系)存儲(chǔ)技術(shù)存儲(chǔ)的基于 XML 模式的 XMLType 數(shù)據(jù)進(jìn)行 XQuery 優(yōu)化。 所選擇的存儲(chǔ)模型并非是影響 XQuery 表達(dá)式執(zhí)行性能的唯一因素。在某些情況下,XQuery 表達(dá)式本身的結(jié)構(gòu)也可能導(dǎo)致性能問(wèn)題。要監(jiān)控 XQuery 表達(dá)式的性能,可以打印并檢查關(guān)聯(lián)的 EXPLAIN PLAN。在 SQL*Plus 中,只需設(shè)置 AUTOTRACE 系統(tǒng)變量,即可打印 SQL 優(yōu)化程序使用的執(zhí)行路徑。但要執(zhí)行該操作,請(qǐng)確保創(chuàng)建 PLUSTRACE 角色,然后將其授予連接到數(shù)據(jù)庫(kù)所使用的用戶。有關(guān)如何執(zhí)行此操作的信息,請(qǐng)參閱 Oracle 數(shù)據(jù)庫(kù) 10g 第 2 版 (10.2) 文檔中《SQL*Plus 用戶指南和參考》一書(shū)中的“調(diào)整 SQL*Plus”一章。以下示例演示了如何通過(guò)檢查 EXPLAIN PLAN 生成的執(zhí)行計(jì)劃來(lái)獲得好處。假設(shè)您已經(jīng)將 PLUSTRACE 角色授予默認(rèn)用戶 OE,以 OE/OE 的身份登錄并運(yùn)行以下查詢: 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('...您可能對(duì)為以上查詢生成的執(zhí)行計(jì)劃并不滿足。尤其是,所處理的行數(shù)可能非常大。由于 SQL 調(diào)整的主要目標(biāo)是避免訪問(wèn)對(duì)結(jié)果沒(méi)有任何影響的行,因此可能要繼續(xù)調(diào)整查詢以優(yōu)化性能。對(duì)查詢中包含的 XPath 表達(dá)式進(jìn)行重新建模后,可以再次重試它,如下所示: 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í)行計(jì)劃并不相同。查看最后一個(gè)示例中的 XQuery 表達(dá)式,您可能會(huì)注重到它迭代頂層 PurchaseOrder 元素,其中的每個(gè) PurchaseOrder 元素都表示基于 PurchaseOrder XMLType 模式的表中的一行。這意味著實(shí)際上重寫(xiě) XQuery 表達(dá)式,以迭帶基礎(chǔ)對(duì)象表(用于存儲(chǔ)分解的 PurchaseOrder 文檔)中的行。與查詢要迭代不表示基礎(chǔ)表中的單個(gè)行的 XML 元素相比,該方法的性能更好一些。 但在某些情況下,很難發(fā)現(xiàn) XQuery 表達(dá)式的哪個(gè)構(gòu)造將使某些查詢的性能更好。這就是為什么最好在開(kāi)發(fā)階段使用調(diào)整工具的原因。 將動(dòng)態(tài)變量綁定到 XQuery 表達(dá)式另一種可以顯著提高 XQuery 表達(dá)式執(zhí)行性能的技術(shù)是使用綁定動(dòng)態(tài)變量。使用綁定變量(而不是將變量串聯(lián)為字符串)可以使 Oracle 重用 SQL 語(yǔ)句,從而減少分析開(kāi)銷并顯著提高應(yīng)用程序的性能。可以在 XMLQuery 和 XMLTable SQL 函數(shù)中使用 PASSING 子句將動(dòng)態(tài)變量綁定到 XQuery 表達(dá)式。該技術(shù)使您可以根據(jù)客戶端代碼中計(jì)算的參數(shù)動(dòng)態(tài)生成 XML。列表 3 中的示例演示了如何在從 PHP 腳本執(zhí)行的 XQuery 查詢中使用綁定變量。 列表 3:使用綁定變量
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩一区二区三区精品视频第3页| 欧美日韩国产在线观看网站| 美女国产一区二区三区| 99在线精品视频在线观看| 日韩黄色大片网站| 精品视频在线观看网站| 欧美精品国产白浆久久久久| 快she精品国产999| 激情综合自拍| 欧美精品一区二区三区精品| 成人免费一区| 美女久久久久久| 久久精品一区二区国产| 欧美日韩伊人| 国产精品www.| 精品免费在线| 精品免费视频| 天堂av在线| 伊人网在线播放| 日韩视频网站在线观看| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 性一交一乱一区二区洋洋av| 日韩久久精品| 国产亚洲一区二区手机在线观看| 久久国产乱子精品免费女| 国产日韩欧美高清免费| 你懂的国产精品永久在线| 国产一区二区色噜噜| 久久久国产精品一区二区中文| 国产精品字幕| 爽爽淫人综合网网站| 日韩av黄色在线| 中文字幕在线看片| 国产精品毛片| 国产精品久久久久久av公交车| 精品国产亚洲一区二区三区在线 | 久久电影tv| 亚洲国产一区二区三区在线播放 | 在线免费观看亚洲| 久久国产免费看| 秋霞国产精品| 免费日韩精品中文字幕视频在线| 日韩avvvv在线播放| 久久精品国产福利| 9国产精品视频| 国产亚洲欧美日韩在线观看一区二区| 精品国产乱码久久久久久樱花| 久久精品国产大片免费观看| 日韩激情一区二区| 日韩精品一区二区三区免费观影 | 午夜精品成人av| 91成人福利| 国产精品美女| 国产精品久久久久久久久免费高清 | 久久av综合| 国产精品色网| 日韩一区亚洲二区| 欧美久久一区二区三区| 日本韩国欧美超级黄在线观看| 亚欧洲精品视频在线观看| sm捆绑调教国产免费网站在线观看 | 精品国产亚洲一区二区在线观看| 首页亚洲欧美制服丝腿| 久久精品国产大片免费观看| 成人在线视频免费| 国产精品亚洲产品| 欧美日韩1区| 日本中文字幕一区二区视频| 欧美日韩激情| 亚洲精品成人| 精品视频黄色| 高清一区二区三区| 国产一区二区视频在线看| 国产欧美丝祙| 国产剧情在线观看一区| 欧美亚洲三区| 麻豆精品蜜桃视频网站| 国产精选久久| 国产精品xxx| 久久在线91| 超碰在线99| 丁香六月综合| 精品国产精品久久一区免费式 | 亚洲伊人精品酒店| 久久av一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲男女av一区二区| 影音先锋国产精品| 日本一区二区中文字幕| 欧美日韩夜夜| 国产精品国产三级国产在线观看| 老牛国内精品亚洲成av人片| 日韩不卡一区| 亚洲欧美日韩一区在线观看| 日韩三区四区| 精品理论电影在线| 亚洲国产一区二区在线观看 | 综合干狼人综合首页| 日韩avvvv在线播放| 国产一区二区久久久久| 91久久久精品国产| 日韩欧美在线精品| 日韩福利一区| 在线免费观看亚洲| 国产高潮在线| 蜜桃视频一区二区三区在线观看| 日韩在线网址| 另类中文字幕国产精品| 亚洲精品成a人ⅴ香蕉片| 日本一区中文字幕| 久久久国产亚洲精品| 日韩国产高清在线| 日韩中文视频| 国产精品久久久久久久久久妞妞| 久久久精品午夜少妇| 国产亚洲字幕| 日韩在线观看一区二区| 99视频精品全部免费在线视频| 日韩国产欧美三级| 999精品一区| 欧美男人天堂| 成人精品视频| 鲁大师成人一区二区三区| 欧美日韩亚洲一区| 丝袜美腿诱惑一区二区三区 | 欧美天堂视频| 精品网站999| 欧美在线看片| 亚洲欧洲免费| 国产女优一区| 波多野结衣一区| 999久久久国产精品| 日韩精品亚洲aⅴ在线影院| 中文字幕系列一区| 国产一区二区三区久久| 国产精品magnet| 国产精品久久久免费| 国产视频一区欧美| 蜜臀久久99精品久久一区二区 | 日韩欧乱色一区二区三区在线| 久久国产小视频| 亚洲www啪成人一区二区| 精品视频国内| 特黄毛片在线观看| 在线日韩中文| 亚洲自啪免费| 亚洲男人在线| 69堂免费精品视频在线播放| 日韩精品社区| 麻豆久久一区二区| 色欧美自拍视频| 日韩视频免费| 国产美女精品视频免费播放软件| 欧美黑人巨大videos精品| 成人欧美一区二区三区的电影| 欧美日韩在线观看首页| 每日更新成人在线视频| 欧美日韩一区二区国产| 桃色av一区二区| 男人操女人的视频在线观看欧美| 亚洲精品系列| 欧美天堂视频| 欧美亚洲网站| 午夜国产一区二区| 欧美天堂一区| 色爱综合网欧美| 午夜久久一区| 国产精品一区二区中文字幕| 国产在线一区不卡| 高清日韩中文字幕| 欧美在线亚洲| 色婷婷综合网| 好看不卡的中文字幕| 亚洲精品字幕| 久久高清精品| 91伊人久久| 亚洲精品一区三区三区在线观看| 亚洲国产影院| 精品高清久久| 亚洲一区日本| 国产欧美日韩一级| 久久亚洲一区| av资源新版天堂在线| 美女精品在线| 激情综合亚洲| 日韩av成人高清| 婷婷国产精品| 日本强好片久久久久久aaa| 高清一区二区| 日本aⅴ亚洲精品中文乱码| 日本在线高清| 日本中文字幕视频一区| 国产精品日本欧美一区二区三区| 日本视频一区二区| 91成人超碰| 国产精品一区二区av交换| 日韩不卡一二三区| 国产精品美女久久久| 日韩理论片av| 丝袜诱惑一区二区|