程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 我與Db2 9新特性的零距離體驗

我與Db2 9新特性的零距離體驗

編輯:DB2教程



   DB2 9中新特性概述
   經過長達 5 年的開發,IBM DB2 9 將傳統的高性能、易用性與自描述、靈活的 xml(標准化越來越近了) 相結合,轉變成為交互式、充滿活力的數據服務器。其中DB2 9的一個最主要的特性就是借助 purexml(標准化越來越近了)? 技術提升 XML(標准化越來越近了) 應用性能,節約開發時間和成本。

   那麼什麼是purexml(標准化越來越近了)呢?我們知道在過去我們將xml(標准化越來越近了) 數據存儲為大對象文本或分散到關系表,這種方式並不能適應靈活的業務需求。DB2 9 的 purexml(標准化越來越近了) 特性革新了 xml(標准化越來越近了) 文檔的處理方式——將 XML(標准化越來越近了) 作為新的數據類型存儲在原生的層次性模型之中。
purexml(標准化越來越近了) 對於 xml(標准化越來越近了) 與關系數據的無縫集成通過靈活的 XML(標准化越來越近了) 索引、SQL 與 XQuery 查詢接口加速了應用開發、提高了搜索性能。

   DB2 以 xml(標准化越來越近了) 數據自身固有的分層格式存儲和處理這些數據,避免因為將 xml(標准化越來越近了) 存儲為 CLOB 中的文本或將它映射為關系表而導致的性能和靈活性限制。與僅使用 xml(標准化越來越近了) 的數據庫不同,DB2 V9 還提供了關系型數據與 XML(標准化越來越近了) 數據在數據庫中的無縫集成 —— 甚至是表的某一行中的集成。這樣的靈活性表現在語言支持中,使您可訪問關系型數據、XML(標准化越來越近了) 數據,或者同時訪問這兩種數據。

   在這篇文章中,我們將會向大家展示如何操作DB2 9中的新的xml(標准化越來越近了)數據類型。我們將通過一個示例來展示如何操作DB2 9中的XML(標准化越來越近了)數據類型。

   准備工作:
   1.創建數據對象
   為了操作方便,我們使用DB2 9中的SAMPLE數據庫,在這裡說明一點,在DB2 Viper中只有Unicode 數據庫才能同時存儲 XML(標准化越來越近了) 文檔和 SQL 數據的更多傳統格式,比如整數、日期/時間、變長字符串,等等。隨後,您將在這個數據庫中創建對象來管理 XML(標准化越來越近了) 和其他類型的數據。

   2.創建數據表
   由於我們使用的是SAMPLE數據庫,該數據庫中有一張CUSTOMER表,CUSTOMER表中有三個字段,其字段名稱和數據類型如圖所示:

我與Db2 9新特性的零距離體驗(圖一)

  該表中有兩個xml(標准化越來越近了)的字段,實際上DB2使用了不同的存儲方案來存儲 xml(標准化越來越近了) 和非 xml(標准化越來越近了) 數據。另外,對xml(標准化越來越近了)的數據類型並沒有進行xml(標准化越來越近了)文檔內部結構的定義,即,用戶不需要為了存儲數據而預定義一個 xml(標准化越來越近了) 數據結構(或者,更准確地說是一個 xml(標准化越來越近了) 模式)。事實上,DB2 可以在一個單獨的列中存儲任何格式良好的 xml(標准化越來越近了) 文檔,這意味著不同模式的 XML(標准化越來越近了) 文檔 —— 或沒有和任何注冊的模式關聯的文檔 —— 都可以存儲在相同的 DB2 列中。

   至此,我們需要的數據庫及其表已經准備就緒,接下來我們就看如何對CUSTOMER這張表中的XML(標准化越來越近了)數據類型進行操作了。

   連接操作
   DB2與JDBC
   為了連接數據庫,需要使用DB2 JDBC技術,依照 JDBC 規范,有四種類型的 JDBC 驅動程序體系結構: 

   Type 1:這類驅動程序將 JDBC API 作為到另一個數據訪問 API 的映射來實現,如開放式數據庫連通性(Open Database Connectivity,ODBC)。這類驅動程序通常依賴本機庫,這限制了其可移植性。JDBC-ODBC 橋驅動程序就是 Type 1 驅動程序的最常見的例子。

   Type 2:這類驅動程序部分用 Java 編程語言編寫,部分用本機代碼編寫。這些驅動程序使用特定於所連接數據源的本機客戶端庫。同樣,由於使用本機代碼,所以其可移植性受到限制。

   Type 3:這類驅動程序使用純 Java 客戶機,並使用獨立於數據庫的協議與中間件服務器通信,然後中間件服務器將客戶機請求傳給數據源。

   Type 4:這類驅動程序是純 Java,實現針對特定數據源的網絡協議。客戶機直接連接至數據源。

   其中COM.ibm.db2.jdbc.app.DB2Driver和COM.ibm.db2.jdbc.Net.DB2Driver
   都在db2java.zip文件中,可以把他改名成db2Java.jar文件使用。 通用驅動程序,放在文件db2jcc.jar文件中。

   這三種驅動的程序加載和連接建立方法如下:

//Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");//Class.forName("COM.ibm.db2.jdbc.Net.DB2Driver");//Class.forName("com.ibm.db2.jcc.DB2Driver");//連接例子可以相同,都是指定主機,端口和數據庫名稱 String dbUrl ="jdbc:db2://localhost:6789/sample";con = DriverManager.getConnection(dbUrl,"www","123456");

   連接的例子
   在這裡我們使用的是通用驅動程序,並采用配置文件的形式,其配置文件是db2Conn.propertIEs。在該配置文件裡有連接數據庫的地址,用戶名,密碼和數據庫名等。其代碼如下:

# PropertIEs file for Java xml(標准化越來越近了) samples# Created on Nov 3, 2004# Description: file containing the value that automate the execution and testing of functions#rollbackCommit=rollback#interactive=yes# Modify the following according to your Machine log inhostName=localhostportNumber=50000passWord=lysdatabaseName=SAMPLEuserName=Administrator# Modify the following to test different situations#purchaSEOrder_id=1020#pID=100-101-01fileName=F:\\eclipse\\WorkPlace\\DB2xml(標准化越來越近了)\\src\\p5.XML(標准化越來越近了)

讀取配置文件和連接數據庫的類(db2Conn.Java)代碼如下:

/**//** Created on Jul 8, 2004**//**//*** File: db2Conn.java** Desc: Utility Class for establishing DB2 connection via JCC Type 4 Driver*/import java.sql.*;public class db2Conn ...{/**//*** Default Constructor*/public db2Conn() ...{}/**//** Get Database connection using Database name, username, password, Machine name and port number*/public static Connection get(String db, String userName, String passwd, String host, String port)...{Connection conn=null;try ...{/**//** Load the DB2(R) JCC driver with DriverManager **/Class.forName("com.ibm.db2.jcc.DB2Driver");/**//** Create Database URL and establish DB Connection **/String databaseURL = "jdbc:db2://"+host+":"+port+"/"+db;java.util.Properties properties = new java.util.Properties ();properties.setProperty ("user", userName);propertIEs.setProperty ("passWord", passwd);conn = DriverManager.getConnection(databaseURL,propertIEs);/**//** print any error messages **/if(conn==null)System.out.println("Connection Failed \n");}catch (ClassNotFoundException e) ...{System.out.println("Exception in DB2Connection");e.printStackTrace();}catch (Java.sql.SQLException e) ...{e.printStackTrace();System.exit(-1); }return conn;}}

   插入操作
   執行插入操作的類為insertXML(標准化越來越近了).Java,該程序讀取一個xml(標准化越來越近了)文件,該xml(標准化越來越近了)文件包括對客戶的描述信息,如:客戶的地址信息、電話、傳真等。並將該xml(標准化越來越近了)文件的內容插入到CUSTOMER表中的XML(標准化越來越近了)類型的字段。
insertXML(標准化越來越近了).Java其代碼如下:
package XML(標准化越來越近了);import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import Java.util.Properties;public class Test2 ...{/**//*** @param args*//**//** private members **/private static Connection conn;static Properties db2ConnProps = new Properties();static Properties fileinputProps = new Properties();public static void main(String[] args) throws FileNotFoundException, IOException, SQLException ...{String db, userName, passwd, host, port;host=port=db=userName=passwd=null;/**//* load the contents of propertIEs file in case of missing arguments*/db2ConnProps.load(new FileInputStream ("F:\\eclipse\\WorkPlace\\DB2XML(標准化越來越近了)\\src\\db2Conn.propertIEs"));db=db2ConnProps.getProperty("databaseName");userName=db2ConnProps.getProperty("userName");passwd=db2ConnProps.getProperty("passWord");host=db2ConnProps.getProperty("hostName");port=db2ConnProps.getProperty("portNumber");/**//** connect to the database **/conn=db2Conn.get(db,userName,passwd,host,port);int id = 99;//由於id是主鍵,所以該id不能相同,如連續插入多次,可以修改id的值或者在數據庫中將CUSTOMER表中的id字段設置為自動增長。 String fn = "F:\\eclipse\\WorkPlace\\DB2xml(標准化越來越近了)\\src\\ClIEnt8877.XML(標准化越來越近了)";String sqls ="insert into customer ( cid, info) values (?, ?)";File file = new File(fn);try ...{PreparedStatement insertStmt = conn.prepareStatement(sqls);conn.setAutoCommit(true);insertStmt.setInt(1, id);insertStmt.setBinaryStream(2, new FileInputStream(file), (int) file.length());if (insertStmt.executeUpdate() == 1) ...{System.out.println("insertBinStream:: No record inserted.");}insertStmt.executeUpdate();} catch (RuntimeException e) ...{// TODO Auto-generated catch block e.printStackTrace();} finally ...{conn.close();}}}
   查詢操作
   查詢xml(標准化越來越近了)字段的類為readXML(標准化越來越近了).Java,該類通過提供cid來查詢客戶表中的info字段並產生XML(標准化越來越近了)文件。
package xml(標准化越來越近了);import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Properties;public class readxml(標准化越來越近了) ...{private static Connection conn;static Properties db2ConnProps = new Properties();private static PreparedStatement poStmt;private static ResultSet rs;static Properties fileinputProps = new Properties();public static void main(String[] args) throws FileNotFoundException,IOException, SQLException ...{String db, userName, passwd, host, port,description;host = port = db = userName = passwd = null;/**//* load the contents of properties file in case of missing arguments*/db2ConnProps.load(new FileInputStream("F:\\eclipse\\WorkPlace\\DB2xml(標准化越來越近了)\\src\\db2Conn.propertIEs"));db = db2ConnProps.getProperty("databaseName");userName = db2ConnProps.getProperty("userName");passwd = db2ConnProps.getProperty("passWord");host = db2ConnProps.getProperty("hostName");port = db2ConnProps.getProperty("portNumber");/**//** connect to the database **/conn = db2Conn.get(db, userName, passwd, host, port);int id = 99;String fn = "F:\\eclipse\\WorkPlace\\DB2xml(標准化越來越近了)\\src\\ClIEnt8877.XML(標准化越來越近了)";String sqls = "insert into customer ( cid, info) values (?, ?)";File file = new File(fn);try ...{System.out.print(getDescription("88"));} catch (RuntimeException e) ...{// TODO Auto-generated catch block e.printStackTrace();} finally ...{conn.close();}}public static String getDescription(String cid)...{String description;description=null; try...{poStmt = conn.prepareStatement("Select INFO from CUSTOMER where cid=?");poStmt.setString(1,cid);rs= poStmt.executeQuery();if(rs.next())...{description=rs.getString(1);}elseSystem.out.println(" Customer info not found.\n");}catch(SQLException sqle)...{System.out.println("Error Msg: "+ sqle.getMessage());System.out.println("SQLState: "+sqle.getSQLState());System.out.println("SQLError: "+sqle.getErrorCode());System.out.println("Rollback the transaction and quit the program");System.out.println();try ...{conn.setAutoCommit(false);}catch (Java.sql.SQLException e)...{e.printStackTrace();System.exit(-1);}try ...{ conn.rollback(); }catch (Exception e)...{JdbcException jdbcExc = new JdbcException(e, conn);jdbcExc.handle();}System.exit(1);}return description;}} 

我與Db2 9新特性的零距離體驗(圖二)

打開: http://www.cncms.com.cn/db2/y372916.Html

   其他查詢操作

   SQL 程序員常常編寫根據某種條件限制從 DBMS 返回的行的查詢。例如,SQL 查詢限制從 "CUSTOMER" 表中檢索的行,使之只包括那些具有某種狀態的客戶。在這個例子中,客戶的狀態可在 SQL VARCHAR 列中捕捉。但是,如果您想根據某種應用於 xml(標准化越來越近了) 列中數據的條件對搜索進行限制,那麼應該怎麼做呢?SQL/xml(標准化越來越近了) 的 XML(標准化越來越近了)Exists 函數為完成該任務提供了一種手段。 

   通過 xml(標准化越來越近了)Exists 可以在 xml(標准化越來越近了) 文檔中找到一個元素,並測試它是否滿足某個特定的條件。如果用在 WHERE 子句中,則 xml(標准化越來越近了)Exists 可以限制返回的結果,使之只包括那些包含具有特定 xml(標准化越來越近了) 元素值的 XML(標准化越來越近了) 文檔的行(換句話說,指定的值等於 "true")。

   例如您想找到居住在具有特定郵政編碼的地區的所有客戶的姓名。您也許還記得," CUSTOMER " 表的一個 xml(標准化越來越近了) 列中存儲了客戶的地址(包括郵政編碼)。通過使用 xml(標准化越來越近了)Exists,可以從 xml(標准化越來越近了) 列中搜索目標郵政編碼,並相應地限制返回的結果集。下面的 SQL/XML(標准化越來越近了) 查詢返回居住在郵政編碼為 95116 的地區的客戶的姓名:
   根據 XML(標准化越來越近了) 元素值限制結果
1select name from CUSTOMER2where XML(標准化越來越近了)exists('$c/ClIEnt/Address[zip="95116"]'3passing CUSTOMER.INFO as "c")4
   如果我們想將 xml(標准化越來越近了) 值投影到返回的結果集。換句話說,我們要從 xml(標准化越來越近了) 文檔中檢索一個或多個元素值。有很多方法可以做這件事。首先我們使用 xml(標准化越來越近了)Query 函數來檢索一個元素的值,然後使用 XML(標准化越來越近了)Table 函數來檢索多個元素的值,然後將這些映射到一個 SQL 結果集的列。
   比如如何創建一個列出 具有某種狀態的客戶的 email 地址的報告。我們可以通過XML(標准化越來越近了)Query 函數來完成這項任務:
檢索符合條件的客戶的 email 信息
select XML(標准化越來越近了)query('$c/ClIEnt/email'passing info as "c")from CUSTOMERwhere status = 'good'
   更新操作
   DB2 允許用 SQL UPDATE 語句或通過使用系統提供的存儲過程(DB2xml(標准化越來越近了)FUNCTIONS.xml(標准化越來越近了)UPDATE)來更新 xml(標准化越來越近了) 列。不管使用哪種方式,對 xml(標准化越來越近了) 列的更新都發生在元素級。然而,使用存儲過程更新 xml(標准化越來越近了) 數據的程序員不需要提供整個 xml(標准化越來越近了) 文檔給 DB2;他們只需指定要更新的 XML(標准化越來越近了) 元素。發出 UPDATE 語句的程序員則需要指定整個文檔(而不僅僅是要更改的元素)。
例如,如果要發出一條 UPDATE 語句來更改某個特定客戶的聯系方式信息中的 email 地址,就必須在 XML(標准化越來越近了) 列中提供全部聯系方式信息,而不僅僅是新的 email 元素值。
update clIEnts set contactinfo=(XML(標准化越來越近了)parse(document '<email>[email protected]</email>' ) )where id = 3227
   本例中更新xml(標准化越來越近了)類型字段的類為updateXML(標准化越來越近了).Java,該類通過提供cid來更新CUSTOMER表中的客戶信息。

   更新操作
   DB2 允許用 SQL UPDATE 語句或通過使用系統提供的存儲過程(DB2xml(標准化越來越近了)FUNCTIONS.xml(標准化越來越近了)UPDATE)來更新 xml(標准化越來越近了) 列。不管使用哪種方式,對 xml(標准化越來越近了) 列的更新都發生在元素級。然而,使用存儲過程更新 xml(標准化越來越近了) 數據的程序員不需要提供整個 xml(標准化越來越近了) 文檔給 DB2;他們只需指定要更新的 XML(標准化越來越近了) 元素。發出 UPDATE 語句的程序員則需要指定整個文檔(而不僅僅是要更改的元素)。
例如,如果要發出一條 UPDATE 語句來更改某個特定客戶的聯系方式信息中的 email 地址,就必須在 XML(標准化越來越近了) 列中提供全部聯系方式信息,而不僅僅是新的 email 元素值。
update clIEnts set contactinfo=(XML(標准化越來越近了)parse(document '<email>[email protected]</email>' ) )where id = 3227 
   本例中更新xml(標准化越來越近了)類型字段的類為updateXML(標准化越來越近了).Java,該類通過提供cid來更新CUSTOMER表中的客戶信息。

import java.sql.*;import java.io.*;import java.util.*;import org.xml(標准化越來越近了).sax.*;import javax.xml(標准化越來越近了).parsers.*;import org.apache(Unix平台最流行的WEB服務器平台).xerces.dom.DOMImplementationImpl;import org.w3c.dom.*;import org.apache(Unix平台最流行的WEB服務器平台).xml(標准化越來越近了).serialize.*;public class updatexml(標准化越來越近了)...{/**//** private members **/private static Connection conn;private static PreparedStatement sStmt;private static PreparedStatement uStmt;private static ResultSet rs;/**//*needed for properties file*/static Properties db2ConnProps = new Properties();static Properties fileinputProps = new Properties();/**//* Default Constructor */public updatexml(標准化越來越近了)() ...{}/**//* Main Driver*/public static void main(String[] args)...{String db,pID, userName, passwd, host, port, pInfo, input, newDoc, xpath, fileName;String inputfile = " ";boolean inputfilevalidate=false;String rollbackCommit="rollback";String interactive = "";boolean exit, update;boolean validate=false;exit=update=false;int option;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String [] productInfo = ...{"name", "details", "price", "weight" };String [] productValues = new String[4];newDoc=pInfo=host=port=db=pID=userName=passwd=input=null;/**//** print user options **/try...{/**//* load the contents of propertIEs file in case of missing arguments*/db2ConnProps.load(new FileInputStream ("F:\\eclipse\\WorkPlace\\DB2XML(標准化越來越近了)\\src\\db2Conn.propertIEs"));db=db2ConnProps.getProperty("databaseName");userName=db2ConnProps.getProperty("userName");passwd=db2ConnProps.getProperty("passWord");host=db2ConnProps.getProperty("hostName");port=db2ConnProps.getProperty("portNumber");rollbackCommit=db2ConnProps.getProperty("rollbackCommit");interactive=db2ConnProps.getProperty("interactive");/**//** establish DB connection **/conn=db2Conn.get(db,userName,passwd,host,port);try...{conn.setAutoCommit(false);}catch (Java.sql.SQLException e)...{e.printStackTrace();System.exit(-1);}/**//* prints current connection status*/System.out.println();System.out.println(" This sample updates xml(標准化越來越近了) information from a table.");System.out.println();System.out.println(" Connect to '"+db+"' database using JDBC Universal type 4 driver");System.out.println(" Connection: com.ibm.db2.jcc");try...{ db2ConnProps.load(new FileInputStream ("F:\\eclipse\\WorkPlace\\DB2XML(標准化越來越近了)\\src\\db2Conn.properties"));}catch(IOException io) ...{System.out.println(io.getMessage());}catch(NullPointerException ne) ...{System.out.println("NullPointerException");}/**//** get product id if not interactive, else request user input**/if (interactive.equals("no"))...{pID = db2ConnProps.getProperty("pID");System.out.println();System.out.println(" Using default product ID of "+pID);}else...{pID=db2ConnProps.getProperty("pID");System.out.println();System.out.print(" Enter Product ID #[default is '1000']:");pID = br.readLine();}/**//*If user just presses enter, then use default value*/if(pID.length()==0)...{System.out.println(" Nothing entered, thus, using default value.");pID=db2ConnProps.getProperty("pID");}else;/**//** prompt for valid product ID **/while((pInfo=getProduct(pID))==null)...{System.out.println();System.out.println(" No Such Product ID can be found. Do you want to use default");System.out.print(" value of "+db2ConnProps.getProperty("pID")+" [y/n] or q to quit: ");input=br.readLine();/**//** if update, parse and update new product **/if(input.equals("y") || input.equals("Y"))...{pID=db2ConnProps.getProperty("pID");System.out.println();System.out.println(" Now using pid="+pID);}else if(input.equals("q") || input.equals("Q"))...{System.out.println(" Quitting program! ");System.exit(-1);}else...{System.out.println();System.out.print(" Please re-enter Product #: ");pID = br.readLine();}}//end while /**//** insert product info into a DOM and use DOM API to extract element values **/domUtility.initializeFromString(pInfo);/**//** Print the product description currently **/System.out.println();System.out.println(" Current contents of DESCRIPTION in the PRODUCTS table");System.out.println(" for pid='"+pID+"'");System.out.println();System.out.println(domUtility.toString("/product"));/**//** print product update options **/printProduct(productInfo);if (interactive.equals("no"))...{ System.out.println(" Just changing #[4] weight");input = "4";}else...{ input = ""; }while(!(input.equals("0") | input.equals("1") | input.equals("2") | input.equals("3") | input.equals("4")))...{System.out.println();System.out.print(" Enter # of the Item to change (or zero to quit): ");input =br.readLine();}option= Integer.parseInt(input);/**//** update product value or exit **/while(!(option == 0))...{System.out.println();switch (option)...{case 0: exit=true;break ;case 1: System.out.print(" Enter new Value for \"name\": ");input=br.readLine();domUtility.setValue("/product/description/name/text()",input);break;case 2: System.out.print(" Enter new Value for \"details\": ");input=br.readLine();domUtility.setValue("/product/description/details/text()",input);break;case 3: System.out.print(" Enter new Value for \"price\": ");input=br.readLine();domUtility.setValue("/product/description/price/text()",input);break;case 4:if (interactive.equals("no"))...{input="5";System.out.println();System.out.println(" Using default Product Weight of 5.");System.out.println();option = 0;}else...{ System.out.print(" Enter new Value for \"weight\": ");input=br.readLine();}domUtility.setValue("/product/description/weight/text()",input);break;default: System.out.print(" Invalid Entry, please try again");break;}//end switch /**//** select next item to update **/if (interactive.equals("no"))...{ input = "0"; }else...{ input = "";printProduct(productInfo);}while(!(input.equals("0") | input.equals("1") | input.equals("2") | input.equals("3") | input.equals("4")))...{System.out.print(" Enter # of the Item to change (or zero to quit): ");input =br.readLine();}option= Integer.parseInt(input);}//end while(!(option == 0)) System.out.println();System.out.println(" Updating the record in the Products table using the above data");System.out.println(" updateProd(domUtility.toString(\"/product\"),pID)");System.out.println();updateProd(domUtility.toString("/product"),pID);/**//** Print the product description currently--before rollback **/pInfo=getProduct(pID);domUtility.initializeFromString(pInfo);System.out.println(" After update, contents of DESCRIPTION in the PRODUCTS table");System.out.println(" for pid='"+pID+"'");System.out.println();System.out.println(domUtility.toString("/product"));//rollback and then print the contents if (rollbackCommit.equals("rollback"))...{System.out.println(" Rollback the transaction.");try...{ conn.rollback(); }catch (Exception e)...{ JdbcException jdbcExc = new JdbcException(e, conn);jdbcExc.handle(); }}else ;/**//** Print the product description currently--After rollback **/pInfo=getProduct(pID);domUtility.initializeFromString(pInfo);System.out.println();System.out.println(" After rollback, contents of DESCRIPTION in the PRODUCTS table");System.out.println(" for pid='"+pID+"'");System.out.println();System.out.println(domUtility.toString("/product"));/**//** close connections **/try ...{conn.commit();}catch(SQLException ex)...{System.err.println("SQLException information");while(ex!=null)...{System.err.println ("Error msg: " + ex.getMessage());System.err.println ("SQLSTATE: " + ex.getSQLState());System.err.println ("Error code: " + ex.getErrorCode());ex.printStackTrace();ex = ex.getNextException(); // For drivers that support chained exceptions }}System.out.println(" Disconnect from the '"+db+"' database");closeConn();System.out.println(" Disconnected.");}catch(NullPointerException ne)...{System.out.println("NullPointerException main");}catch(IOException io)...{io.printStackTrace();}}//main public static void setConn(Connection c)...{conn=c;}/**//* Get product from database */public static String getProduct(String pID)...{String pInfo=null;try...{/**//** Prepare Statement **/sStmt= conn.prepareStatement("Select INFO from CUSTOMER where cid=?");sStmt.setString(1,pID);rs=sStmt.executeQuery();if (rs.next())...{pInfo=rs.getString(1);}else;}catch(SQLException sqle)...{System.out.println("Error Msg: "+ sqle.getMessage());System.out.println("SQLState: "+sqle.getSQLState());System.out.println("SQLError: "+sqle.getErrorCode());System.out.println("Rollback the transaction and quit the program");System.out.println();try ...{ conn.rollback(); }catch (Exception e)...{JdbcException jdbcExc = new JdbcException(e, conn);jdbcExc.handle();}System.out.println();System.exit(1);}return pInfo;}//end getProduct /**//* Update Product */public static void updateProd(String newDoc, String pID)...{int recordUpdated=0;try...{/**//** Prepare Statement **/uStmt= conn.prepareStatement("Update CUSTOMER set INFO = ? where PID=?");uStmt.setString(1,newDoc);uStmt.setString(2,pID);if(uStmt.executeUpdate()!=1)System.out.println("Product could not be updated");else ;}catch(SQLException sqle)...{System.out.println("Error Msg: "+ sqle.getMessage());System.out.println("SQLState: "+sqle.getSQLState());System.out.println("SQLError: "+sqle.getErrorCode());System.out.println("Rollback the transaction and quit the program");System.out.println();try ...{ conn.rollback(); }catch (Exception e)...{JdbcException jdbcExc = new JdbcException(e, conn);jdbcExc.handle();}System.exit(1);}}//end updateProd /**//* Print Product Update Values */public static void printProduct(String [] pInfo)...{String pValue, xpath;pValue = xpath = null;System.out.println();System.out.println(" Product ID="+domUtility.getValue("/product/@pid")+"\n");for(int i=0; i < pInfo.length; i++)...{xpath="/ClIEnt/description/"+pInfo[i]+"/text()";pValue = domUtility.getValue(xpath);if(pValue != null)System.out.println(" ["+(i+1)+"] "+pInfo[i].toString()+" : "+ pValue);}}//end printProduct /**//* Close conections */public static void closeConn()...{try...{conn.close();sStmt.close();uStmt.close();}catch(SQLException sqle)...{System.out.println(sqle.getMessage());System.out.println(sqle.getSQLState());System.out.println(sqle.getErrorCode());}}//end closeConn }
   刪除 XML(標准化越來越近了) 數據
   刪除包含 xml(標准化越來越近了) 列的行很簡單。SQL DELETE 語句允許通過 WHERE 子句識別(或限制)要刪除的行。該子句可以包括簡單的謂詞來標識非 xml(標准化越來越近了) 列值或包括 SQL/xml(標准化越來越近了) 函數來標識包含在 xml(標准化越來越近了) 列中的 XML(標准化越來越近了) 元素值。

   例如,下面展示了如何刪除客戶 CID 為 3227 的客戶的所有信息:
delete from CUSTOMER
where cid = 1000

   還記得怎樣限制 SQL SELECT 語句,使之僅返回居住在郵政編碼為 95116 的地區的客戶的行嗎?如果還記得的話,很容易知道如何刪除與那些客戶相關的行。下面看看如何使用 XML(標准化越來越近了)Exists 來做這件事:

   刪除居住在特定地區的客戶的數據
delete from clIEnts
where XML(標准化越來越近了)exists('$c/ClIEnt/Address[zip="95116"]'
passing CUSTOMER.INFO as "c");baidu: http://www.cncms.com.cn/db2/y372916.Html
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved