■ 開發前要求配置 ■ Select XML格式資料 ■ Insert XML格式資料 ■ Updata XML格式資料 ■ Delete XML格式資料開發前要求配置 必須安裝Oracle用戶端 把Classpath指向 classes111.zip xmlparserv2.jar xsu111.jar xsu12.jar Select XML格式資料 由於兩者之間具有相近的階層資料關係,關聯式資料庫模式能XML來類比。假設一個書目列表的資料庫,BookList表設有下述列:BookID、Title、Author 、Publisher、Year、ISBN和描述。下面是應用程式對資料庫進行的典型查詢: SELECT Title,Author,Publisher,Year,ISBN FROM BOOKLIST WHERE BOOKID=1234; 若通過Orale XML SQL Utility提交查詢,資料庫將返回下述結果: <?xml version=’’1.0’’?> <ROWSET> <ROW id=”1”> <TITLE>The Difference Between God and Larry Ellison:Inside Oracle Corporation</TITLE> <AUTHOR>Mike Wilson<AUTHOR> <PUBLTSHER>William Morrow and Co.</PUBLISHER> <YEAR>1997</YEAR> <ISBN>0688149251</ISBN> </ROWSET> 如果應用程式只想簡單地把輸出寫入到檔案,可以用字串形式輸出。如 果直接送給Oracle XML解析器用XSLT處理器進行變換,可以用DOM對象形式輸出。提供DOM輸出可以無需解析操作,否則在應用XSL轉換之前需要實施解析操作。 如下列程式碼片段所示,通過把查詢傳遞給oranle.xml.sql.query.Oracle XML Query類進行查詢提交: import java . sql . * ; import java . math . * ; import Oracle . xml . sql .query . * ; import oracle . jdbc .* ; import oracle . jdbc . driver . * ; public static void main (String args[ ])throws SQLException { string tabName = “Booklist” ; string user = “scott/tiger” ; DriverManager . registerDriver(new oracle . jdbc .driver .oracleDriver( )) ; Connection conn= DriverManager . getConnection( “jdbc:oracle:oci8”+user+”@”) ; OracleXMLQuery qry = new OracleXMLQuery(conn, “select * from+tabName”); String xmlstring = qry . getXMLString( ) ; System . out .println (“OUTPUT IS :\n “+xmlstring”); Conn . close ( ) ; Oracle XML SQL Utility也提供可選的命令列介面,它用於產生與特殊資料庫模式相關的DTD。假定所有的內容都已正確安裝,只需要執行如下命令就可得到完整的命令列選列表: Java oraclexml 下面的命令列用於怎樣建立與正在查詢的特殊資料庫模式相關的DTD: java oraclexml getxml ?scott/tiger “scott/tiger”-withDTD “SELECT” * FROM BookList” 對於前面所說的BOOKLIST表,在該查詢產生的XML文檔中Oracle XML SQL Utility會輸出如下的DTD: 〈!ELEMENT BOOKLIST (BOOKID, Title, Author, Publisher, Year, ISBN, Description)〉 <!ELEMENT BOOKID (#PCDATA)> <!ELEMENT Author (#PCDATA)> <!ELEMENT Publisher (#PCDATA)> <!ELEMENT Year (#PCDATA)> <ELEMENT ISBN (#PPCDATA)> <!ELEMENT Description (#PCDATA)> Insert XML格式資料 一旦在資料庫中建立了模式,只要XML格式的資料與從模式中產生的DTD相符,XML SQL Utility就會把資料儲存到模式中去。XML SQL Utility提供把XML文檔映射為表行的能力。該儲存使用簡易對應將元素標記名映射為列,通過預設映射,將XML字串轉換為合適的資料類型。當XML元素還有子項目時,則該XML元素被映射為SQL物件類型。 為了儲存XML格式的資料,XML SQL Utility啟動一個插入語句,在插入語句的VALUES子句中綁定所有元素值。每個行元素的內容被映射為一個單獨值集合。 返回到本章前面的Booklist範例,下面是儲存XML格式的項的SQL語句: INSERT INTO BOOKLIST (BookID, TITLE, AUTHOR, PUBLISHER, YEAR, ISBN,DESCRIPTION) VALUS (?,?,?,?,?,?,?) and BIND the values, BOOKID - > 1234 TITLE - > The Difference Between God and Larry Ellison: Inside Oracle Corporation AUTHOR - > Mike Wilson PUBLISHER - > William Morrow & Co. YEAR - > 1997 ISBN - > 0688149251 Description - > Account of Larry Ellison ; 如下範例代碼示範了Java程式中是如何完成此功能的: import oracle.xml.sql.dml.*; import java.sql.*; import oracle.jdbc.driver.*; import oracle.jdbc.*; import java.net.*; public class save_sample { public static void main (String args[]) throw SQLException { Srting tabName =”BOOKLIST”; // table into which to insert String fileName =”samdoc.xml”; // file containing the xml doc DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection(“jdbc:oracle:oci8:scott/tiger@”); OracleXMLSave sav = new OracleXMLSave(conn,tabName); URL url = sav.createURL(fileName); Int rowCount = sav.insertXML(url); System.out.println(“successfully inserted “+rowCount+ “rows into “+tabName); conn.close(); } } 像getXML一樣,儲存功能也有一個命令列版本,叫做putXML。它可用於大量載入XML資料。如下的命令將載入一個XML文檔,其中該文檔中包含有與範例DTD相符合的書目列表。 Java oraclexml putXML ?user “scott/tiger” sampdoc.xml BookList Updata XML格式資料 更新操作可應用於表中的多行,這點和插入操作不同。如果匹配列不是表中的關鍵字列,則被更新的XML元素也許會匹配多行。所以更新操作需要一個關鍵字列的列表,其中該公用程式使用該列表來確定要更新的行。下面的書目列表更新例子說明了這種情況: <ROWSET> <ROW num=”1”> <BOOKID>1234</BOOKID> <TITLE> The Difference Between God and Larry Ellison: Inside Oracle Corporation </TITLE> <AUTHOR>Mike Wilson</AUTHOR> <PUBLISHER>William Morrow and Co.</PUBLISHER> <YEAR>1997</YEAR> <ISBN>0688149251</ISBN> </ROW> </ROWSET> 該XML更新會執行如下的傳遞BookID列和關鍵字列值的SQL語句: UPDATE BOOKLIST SET TITLE = ? , AUTHOR = ? WHERE BOOKID = ? and bind the values, BOOKID - >1234 TITLE - > The Difference Between God and Larry Ellison: Inside Oracle Corporation AUTHOR - > Mike Wilson; 請注意,不需要更新最初XML文檔中的所有列。如下的範例代碼給出了Java程式是如何完成此功能的: import oracle.xml.sql.dml.*; import java.sql.*; import oracle.jdbc.driver.*; import oracle.jdbc.*; public class ListUpdate { public static void main(String argv[]) throws SQLException { String tabName = “BOOKLIST”; // table into which to insert DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection(“jdbc:oracle:oci8:scott/tiger@”); OracleXMLSave sav = new OracleXMLSave(conn,tabName); String [] keyColNames=new string[1]; keyColNames[0]=”BOOKID”; sav.setKeyColumnNames(keyColNames); sav.updateXML(argv[0]); sav.close(); } } Delete XML格式資料 XML SQL Utility也支援XML文檔的刪除操作。像更新操作一樣,刪除操作也使用關鍵字列來確定被刪除的行。如果沒有給出一個或多個關鍵字列,刪除操作仍將試著匹配文檔中的列。下面是XML文檔和對應的SQL刪除語句: <ROWSET> <ROW num=”1”> <BOOKID>1234</BOOKID> <TITLE> The Difference Between God and Larry Ellison: Inside Oracle Corporation</TITLE> <AUTHOR>Mike Wilson</AUTHOR> <PUBLISHER>William Morrow and Co. </PUBLISHER> <YEAR>1997</YEAR> <ISBN>0688149251</ISBN> </ROW> </ROWSET> DELETE FROM BOOKLIST WHRE TITLE = ? AND AUTHOR = ? AND PUBLISHER = ? AND YEAR = ? AND ISBN = ? AND BOOKID = ? binding, BOOKID < - 1234 TITLE < -The Difference Between God and Larry Ellison : Inside Oracle Corporation AUTHOR < - Mike Wilson PUBLISHER < - William Morrow & Co. YEAR < -1997 ISBN < - 0688149251 下例顯示了Java如何?刪除操作,其中用BookID作為關鍵字列: import oracle.xml.sql.dml.*; import java.sql.*; import oracle.jdbc.driver.*; import oracle.jdbc.*; public class ListDelete { public static void main(String argv[]) throws SQLException { String tabName = “BOOKLIST” ; // table into which to delete data DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection(jdbc:oracle:oci8:scott/tiger@”); OracleXMLSave sav = new OracleXMLSave(conn, tabName); String [] keyColNames = new String[1]; keyColNames[0] = “BookID”; sav.setKeyColmnNames(keyColNames); sav.deleteXML(argv[0]); sav.close(); } } |