亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > DB2 > 正文

將XML應用程序從DB2 8.x遷移到Viper

2024-09-06 23:58:11
字體:
來源:轉載
供稿:網友

簡介

db2 universal database (udb) version 8.x 中的 xml 支持基于 db2 的關系基礎設施。在 db2 viper 版本之前,xml 數據要么原樣存儲為字符大對象 (clob),要么被分解到關系表中。

相反,db2 udb version 9.1 具有對 xml 數據的真正本機支持。xml 現在被當作新的數據類型,xml 數據存儲在經過解析的帶注釋的樹中,獨立于關系數據存儲。基于 xml 模式的 xml 索引已經引入,同時還引入了對用于查詢和發布 xml 數據的語言 xquery 和 sql/xml 的支持。為了理解這些新的 xml 特性對遷移的重大意義,需要將 db2 8.x 中用于存儲和查詢 xml 數據的不同技術與 db2 udb version 9 中可用的類似的或新的 xml 功能相比較。

本文是關于將 xml 應用程序從 db2 8.x 遷移到 db2 viper 的三篇系列文章中的第一篇。該系列從描述一個基于 java 的存儲過程開始,您可以使用該存儲過程來對 xml 數據執行子文檔更新。您可以下載更新后的存儲過程的源代碼和 jar 文件,并根據說明安裝它。

第二篇文章比較 db2 version 8.x 中和 db2 viper 中的 xml 特性。然后簡要討論 db2 viper 中引入的新 xml 特性,并詳細介紹新 xml 支持對于遷移現有基于 xml 的應用程序的重大意義。這篇文章還包括基于 java 的實用工具的源代碼,該工具用于幫助生成遷移數據庫對象時所需的腳本。

本系列的最后一篇文章介紹分步示例遷移場景。它包括示例場景的源代碼。

更新存儲過程

對于本機存儲在 db2 中的 xml 文檔,不存在用于執行子文檔更新的開箱即用的功能。缺少該功能的原因是,目前還沒有定義 xquery 中更新的標準。

該問題的一種解決方案是,將文檔交給客戶機,修改它,然后再將其保存到數據庫中。該方法受到客戶機環境的 xml 功能的限制,并且還要求專家級的人員編寫基于文檔對象模型 (dom) 的客戶機。

通過創建更新存儲過程,可以更新數據庫中的 xml 文檔而無需將其交給客戶機。該存儲過程支持對本機存儲在數據庫中的 xml 文檔進行部分更新。

存儲過程允許:

更改目標 xml 文檔中任何文本或屬性節點的值

使用另一個 xml 元素替換 xml 文檔中的元素節點(及其所有子節點)

刪除 xml 文檔中的節點

插入新元素

多次更新源文檔

更新多個源文檔

使用修改的 xml 文檔替換另一個 xml 文檔

將修改的文檔插入新記錄

更新信息可以:

靜態地嵌入更新調用中

使用 sql 在運行時動態地創建

使用算術表達式基于初始文本或屬性值進行計算

注意:在后臺,更新存儲過程仍然執行完整的文檔更新。

 

 

xmlupdate 命令

db2xmlfunctions.xmlupdate (commandxml、querysql、updatesql、errorcode、errormsg)

commandxml —— 該參數是一個用于封裝更新命令的 xml 字符串。這些命令將應用到由 querysql 所選擇的 xml 文檔。

該命令的結構是:

<updates namespaces=""> <update using="" col="" action="" path="">update value</update> </updates>

—— 這是用于包裝所有更新命令元素的根元素。

@namespace —— 該屬性的值應該是由分號分隔的 “前綴:名稱空間” 字符串。前綴然后用于在 xml 文檔中導航時使用的任何路徑表達式中。

essential —— 否(僅當在任何路徑中使用名稱空間時才需要它)。

即使是默認名稱空間也必須用一個前綴進行限定。

—— 該元素定義需要在目標 xml 文檔上執行的每個修改。

occurrence —— 可以定義這些元素中的一個或多個。

每次出現處理文檔的一個修改。

@col —— 該屬性的值應該是對應于要在 querysql 中修改的列位置的編號。

essential —— 是。

valid value —— 列位置從 1 開始。

@path —— 該屬性的值是目標 xml 文檔中節點的 xpath 位置。如果路徑無效,則存儲過程將中止。

essential —— 是。

valid value —— xpath 表達式。

如果要在 xpath 中使用名稱空間,請確保設置名稱空間屬性。

不能將通配符用于名稱空間。

@using —— 該屬性的惟一有效值是 sql。如果該屬性存在并設置為 sql,那么 update value( 元素的子節點)被視為一個 sql 查詢。查詢結果的第一行中的第一列將用作新的 update value。如果查詢失敗,那么存儲過程將中止。

essential —— 否。

valid value —— sql。

對于 xquery,可以使用關鍵字 xquery,也可以使用 sql/xml 函數將 xquery 嵌入 sql。

@action —— 該屬性定義將在 xml 文檔中的目標節點(使用 @path 屬性中定義的 xpath 來定位)上進行的操作。如果操作失敗,那么存儲過程將中止。

essential —— 否。如果未設置操作,則假定是一個替換操作。

valid value —— 替換、追加、刪除和計算:

replace —— 使用 update value 替換目標節點。

append —— 將 update value 作為子節點追加到目標節點。

delete —— 刪除目標節點。

compute —— 將 update value 當作參數化的表達式。表達式中的問號 (?) 將由目標節點的現有文本值替換。然后,計算表達式,得到的值將替換目標節點中的現有值。計算出的值的 xpath 只能是葉節點。

update value —— 這為每個更新命令 (//update/*) 的子節點。它可以是文本節點,也可以是元素。

essential —— 否。對于 action=delete,不需要它。

valid value —— 當 @using 屬性被設置為 sql 時,子節點應該是文本值。它被當作 sql 表達式。當 @action 屬性被設置為 compute 時,子節點應該是文本值。它被當作參數化表達式。在所有其他情況下,子節點都視為要替換的值。

querysql —— 任何用于檢索需要更新的 xml 文檔的有效 sql 選擇語句。

essential —— 是。

valid value —— 只能選擇 xml 文檔。如果選擇了其他列,存儲過程就會中止。

updatesql —— 它表示參數化的更新 sql。修改的 xml 文檔作為運行時參數被綁定到更新 sql。它允許將修改的 xml 文檔保存到數據庫中的其他 xml 列中。

essential —— 否。如果該參數為 null,則使用可更新的游標來修改所選的列。

重要事項:從命令行處理器 (clp) 執行更新存儲過程時,始終需要設置 updatesql 參數的值。如果將這個值設置為 null 或空字符串,clp 會拋出 jcc 異常:column not updatable。當您從應用程序代碼 (java) 內部調用更新存儲過程時,將發生此情況(即 updatesql 設置為 null)。

errorcode —— 值為 -1 指示存儲過程因發生某種錯誤而中止。如果更新成功,則返回指示已更新的記錄數的正值。

errormsg —— 錯誤消息,包括 xml 解析器和 jcc 驅動程序拋出的任何異常。

注意:如果得到 java.lang.outofmemoryerror,應該增加 java 堆大?。?

db2 update dbm cfg using java_heap_sz 1024

 

設置存儲過程

首先需要將更新存儲過程 jar 安裝到 db2 中。這個過程僅需執行一次。下一步,對于每個數據庫,需要分別注冊存儲過程。

重要事項:如果希望在存儲過程中執行 xqueries,那么需要為 db2 設置 jcc 驅動程序。確保 db2 在運行,然后從 db2 命令窗口執行以下命令:

db2set db2_use_db2jcct2_jroutine=on

設置更新存儲過程的步驟

通過執行以下步驟編譯 java 代碼并創建 db2xmlfunctions.jar 文件。

注意:db2xmlfunctions.jar 還可以從 下載 部分下載。如果您選擇下載該文件,則跳過 第 2 步。

創建目錄 /temp/samples。

將 xmlupdate_code.zip(可以在 下載 部分找到)復制到 temp 目錄。

將 xmlupdate.java 和 xmlparse.java 文件解壓到 /temp/samples 目錄。

編譯 java 文件并為 udf 創建 jar 文件。

在 microsoft windows 上,打開 db2 命令窗口:

set classpath= .;%db2path%/java/db2java.zip; %db2path%/java/db2jcc.jar; %db2path%/java/db2jcc_license_cisuz.jar; "%db2path%/java/jdk/bin/javac.exe" -d . *.java "%db2path%/java/jdk/bin/jar" cvf db2xmlfunctions.jar com/ibm/db2/xml/functions/*.class

在 aix 上,將 db2path 設置為 db2 sqllib 目錄:

classpath=$db2path/java/sqlj.zip:$db2path/java/db2java.zip $db2path/java/jdk/bin/javac.exe" -d . *.java $db2path/java/jdk/bin/jar" cvf db2xmlfunctions.jar com/ibm/db2/xml/functions/*.class

注意:上述命令假定使用 sh 或 bash shell。根據需要更改為 csh、tsh 等。

在 db2 中安裝存儲過程:

db2 -t connect to your_dbname&yuml; call sqlj.install_jar('file:/temp/samples/db2xmlfunctions.jar' , db2xmlfunctions,0);

在數據庫中注冊存儲過程:

create procedure db2xmlfunctions.xmlupdate( in commandsql varchar(32000), in querysql varchar(32000), in updatesql varchar(32000), out errorcode integer, out errormsg varchar(32000)) dynamic result sets 0 language java parameter style java no dbinfo fenced null call modifies sql data program type sub external name 'db2xmlfunctions:com.ibm.db2.xml.functions.xmlupdate.update' ; terminate;

刪除存儲過程

如果更改了存儲過程,那么在注冊新版本之前應該首先從 db2 卸載它:

drop procedure db2xmlfunctions.xmlupdate(varchar(32000), varchar(32000),varchar(32000),integer, varchar(32000)); call sqlj.remove_jar(db2xmlfunctions);

 

 

xmlupdate 示例

對于 xmlupdate 示例,請執行以下步驟:

創建測試表:

create table xmlcustomer(cid integer not null primary key, info xml );

將示例 xml 文檔插入表中:

insert into xmlcustomer (cid, info ) values (1006 , xmlparse ( document ' <customerinfo xmlns=" http://posample.org " cid="1006"> <name>hardeep singh</name> <addr country="united states"> <street>555 bailey ave</street> <city/> <prov-state>ca</prov-state> <pcode-zip> 95141</pcode-zip> </addr> <phone type="">543-4610</phone> </customerinfo>' preserve whitespace ) );

注意:由于更新調用修改了初始的 xml 文檔,所以您需要為某些查詢而刪除插入的文檔,并重新插入它。

示例查詢

下面是示例查詢:

替換節點:action=replace。

通過使用復雜名稱元素替換簡單名稱元素來更新測試文檔:

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:name"> <name><fname>hardeep</fname><lname>singh</lname></name> </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

使用 sql 查詢獲取新值以進行更新:

using=sql。 call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update using="sql" action="replace" col="1" path="http://x:customerinfo[@cid=1006]/x:addr/x:pcode-zip/text()"> select cid from xmlcustomer where cid=1006 </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

使用給定表達式來計算值:

action=compute。 call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="compute" col="1" path="/x:customerinfo/x:addr/x:pcode-zip/text()"> (20+?)*32-? </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? &yuml;here cid=1006',?,?);

對目標 xml 文檔執行多個操作:

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update using="sql" action="replace" col="1" path="/x:customerinfo/x:addr/x:pcode-zip/text()"> select cid from xmlcustomer where cid=1006 </update> <update action="compute" col="1" path="/x:customerinfo/x:addr/x:pcode-zip/text()"> (2+?)*10-? </update> <update action="delete" col="1" path="/x:customerinfo/x:name"/> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

更新文檔時對其進行驗證。

為此,您需要創建模式并在 xsr 中注冊。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update using="sql" action="replace" col="1" path="/x:customerinfo/x:addr/x:pcode-zip/text()"> select cid from xmlcustomer where cid=1006 </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=xmlvalidate( ? according to xmlschema id test.schema2) where cid=1006',?,?)

使用 xmlupdate 替換屬性值。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:phone/@type"> tie line </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

使用 xmlupdate 替換文本值。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:addr/x:city/text()"> san jose </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

 

 

重要事項:必須在路徑的末尾指定 text()。這一步確保即使是空元素(即不具有現有文本節點的元素)也進行更新。如果省略了 text() 且不存在要替換的現有文本值,更新命令就會失敗。

使用 xmlupdate 追加子節點。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="append" col="1" path="/x:customerinfo/x:addr"> <county>santa clara</county> </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

注意:新節點 不在任何名稱空間中。

使用 xmlupdate 將更新的 xml 插入新行。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:name"> <name>marja soininen</name> </update> <update action="replace" col="1" path="/x:customerinfo/@cid">1008</update> </updates>', 'select info from xmlcustomer where cid=1006', 'insert into xmlcustomer (cid, info ) values (1008, cast( ? as xml))',?,?);

使用 xmlupdate 刪除節點。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="delete" col="1" path="/x:customerinfo/x:name"/> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

當更新元素中沒有設置 @action 時,就默認執行替換操作。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update col="1" path="http://x:customerinfo[@cid=1006]/x:phone"> <phone><areacode>910</areacode></phone> </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

以下示例展示帶有無效名稱空間或帶有沒有前綴的名稱空間的 xmlupdate:

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://my.org"> <update col="1" path="http://x:customerinfo[@cid=1006]/x:phone"> <phone><areacode>910</areacode></phone> </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

該查詢返回設置為 1 的錯誤,以及如下錯誤消息:

<error type='abort' action='replace' msg='cannot find path //x:customerinfo[@cid=1006]/x:phone) in the xmldocument'>

以下示例展示的 xmlupdate 在更新元素中有一個遺漏的路徑:

call db2xmlfunctions.xmlupdate ( '<updates > <update col="1"> (20+?)*32-? </update></updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

該查詢返回設置為 1 的錯誤,以及如下錯誤消息:

<error type='abort' action='null' msg='path not defined'></error>

使用相同名稱空間中的新節點替換某個節點。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:name"> <name xmlns="http://posample.org"> <fname>marja</fname><lname>soininen</lname> </name> </update> </updates>', 'select info from xmlcustomer where cid=1008', 'insert into xmlcustomer (cid, info ) values (1007, cast( ? as xml))',?,?);

結束語

本文描述的更新存儲過程允許對本機存儲在數據庫中的 xml 文檔進行部分更新。下一篇文章將深度挖掘和具體研究新的 xml 支持對遷移現有基于 xml 的應用程序的重大意義。

致謝

感謝 matthias nicola、bert van der linden、irina kogan、annie wang、ying chen 和 xiaoli du 在撰寫這篇文章時給予的幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线免费看av不卡| 亚洲午夜精品久久久久久久久久久久| 国产欧美日韩精品在线观看| 日韩精品一区二区视频| 欧美在线视频一二三| 欧美激情a在线| 91沈先生作品| 国产精品丝袜白浆摸在线| 久久五月情影视| 中文字幕综合在线| 97久久精品人搡人人玩| 96pao国产成视频永久免费| 伊人久久男人天堂| 欧美在线视频网站| 久久久噜噜噜久久| 亚洲欧美激情四射在线日| 91伊人影院在线播放| 5566日本婷婷色中文字幕97| 亚洲福利视频网| 国产91对白在线播放| 国产亚洲精品美女久久久| 一区二区三区回区在观看免费视频| 欧美精品一本久久男人的天堂| 在线视频欧美日韩精品| 国产精品一区二区三区免费视频| 精品国产户外野外| 国产成人精品免费久久久久| 欧美性xxxxx极品娇小| 中文字幕日韩在线观看| 欧美另类高清videos| 久热99视频在线观看| 国产精品女人久久久久久| 久久成人免费视频| 亚洲乱码国产乱码精品精天堂| 国产91精品最新在线播放| 亚洲色图50p| 久久精品国产69国产精品亚洲| 蜜臀久久99精品久久久无需会员| 日韩在线资源网| 日韩在线视频线视频免费网站| 久久久国产精品视频| 欧美激情一区二区久久久| 亚洲女人天堂视频| 欧美激情精品久久久久久变态| 最近2019中文字幕mv免费看| 精品国产户外野外| 亚洲精品午夜精品| 成人免费在线视频网址| 欧美在线视频播放| 精品毛片三在线观看| 一区二区三区视频免费| 欧美激情视频给我| 中文字幕不卡在线视频极品| 中文字幕亚洲综合久久筱田步美| 亚洲欧美三级在线| 亚洲精品二三区| 久久精品99久久久香蕉| 国产精品福利无圣光在线一区| 26uuu日韩精品一区二区| 国产精品无码专区在线观看| 欧美成aaa人片免费看| 综合网中文字幕| 97超级碰在线看视频免费在线看| 欧美—级a级欧美特级ar全黄| 欧洲成人性视频| 国产精品精品视频| 91中文精品字幕在线视频| 亚洲成人国产精品| 国产精品极品美女在线观看免费| 国产69精品久久久久久| 国产精品露脸av在线| 日韩av网址在线观看| 992tv在线成人免费观看| 午夜精品在线观看| 亚洲午夜未删减在线观看| 成人h片在线播放免费网站| 91精品国产色综合久久不卡98口| 日韩欧美精品网址| 欧美一区二区色| 色av吧综合网| 日韩免费看的电影电视剧大全| 国产在线精品成人一区二区三区| 亚洲免费伊人电影在线观看av| 日韩精品中文字幕在线观看| 亚洲性猛交xxxxwww| 亚洲午夜精品久久久久久久久久久久| 日韩av观看网址| 亚洲欧美制服综合另类| 91av视频在线免费观看| 成人春色激情网| 欧美成人免费一级人片100| 亚洲a∨日韩av高清在线观看| 欧美激情亚洲激情| 欧美在线播放视频| 国模gogo一区二区大胆私拍| 色婷婷久久一区二区| 韩国国内大量揄拍精品视频| 97免费在线视频| 欧美电影免费看| 欧美成人免费一级人片100| 精品久久久久久久久久久久久| 亚洲精品综合精品自拍| 久久久www成人免费精品| 91视频88av| 色综合天天狠天天透天天伊人| 91久久综合亚洲鲁鲁五月天| 久久精品人人爽| 国产欧美亚洲视频| 国产精品高潮呻吟视频| 国产视频亚洲视频| 57pao国产精品一区| 欧美激情一级精品国产| 久久久久在线观看| 亚洲美女在线观看| 欧美另类老肥妇| 日韩av片永久免费网站| 亚洲毛片在线观看| 欧美国产日韩一区| 欧美日韩成人免费| 亚洲精品一区二区三区不| 91久久精品久久国产性色也91| 55夜色66夜色国产精品视频| 成人妇女免费播放久久久| 日本亚洲欧洲色| 91精品久久久久久久| 欧美日韩爱爱视频| 日韩精品在线观| 亚洲天堂网站在线观看视频| 国产一区二区精品丝袜| 91精品国产91久久| 亚洲小视频在线| 亚洲www永久成人夜色| 国产精品 欧美在线| 国产精品自产拍在线观看中文| 精品亚洲一区二区三区| 亚洲激情国产精品| 久久精品电影网站| 亚洲色图色老头| 久久国产精品免费视频| 国产精品最新在线观看| 欧美一级bbbbb性bbbb喷潮片| 日韩在线观看免费网站| 国产精品青青在线观看爽香蕉| 久久亚洲影音av资源网| 亚洲女人被黑人巨大进入al| 日韩av手机在线| 欧美日韩国产一区在线| 亚洲一区二区精品| 久久91精品国产| 一本色道久久综合亚洲精品小说| 欧美高清视频一区二区| 日韩成人在线电影网| 91精品国产91久久久久久不卡| 狠狠躁夜夜躁久久躁别揉| 91av在线国产| 精品国产自在精品国产浪潮| 午夜精品一区二区三区av| 黑人精品xxx一区| www.欧美视频| 中日韩美女免费视频网站在线观看| 日韩成人激情视频| 成人福利视频网| 97视频在线观看网址| 亚洲性猛交xxxxwww|