?? oracle_xml.txt
字號:
一個ORACLE導入和導出XML文件的例子
導入:
/*****************************************************************************
過程名稱:add_to_stockmarket
參數1:fileName in varchar2 接收用戶輸入的xml文件名
功能:將xml文件中的數據導入到Stockmarket數據表中
*****************************************************************************/
create or replace procedure add_to_stockmarket(fileName IN varchar2) as
document xmldom.DOMDocument;--聲明文檔對象模型
subelement xmldom.DOMElement;--聲明元素類型
nodelistStock xmldom.DOMNodeList;
nodelistStockChild xmldom.DOMNodeList;
stock_code char(6);--stock字段
stock_name varchar2(30);--stockname字段
stock_shortname varchar(30);--stockshortname字段
stock_buydate date;--stockbuydate字段
recordCountOuter number;--存儲xml文檔中stock元素的個數
quantity exception;
begin
document:=xmlparser.parse(fileName);--解析xml文檔
subelement:=xmldom.getDocumentElement(document);--獲得根元素
nodelistStock:=xmldom.getElementsByTagName(subelement,'Stock');
recordCountOuter:=xmldom.getLength(nodelistStock);
for outerCycle in 0..recordCountOuter-1 loop--循環記錄信息
nodelistStockChild:=xmldom.getChildNodes(xmldom.item(nodelistStock,outerCycle));
if xmldom.getLength(nodelistStockChild)<>4 then
raise quantity;
end if;
stock_code:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(nodelistStockChild,0)));
stock_name:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(nodelistStockChild,1)));
stock_shortname:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(nodelistStockChild,2)));
stock_buydate:=to_date(xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(nodelistStockChild,3))),'yyyy-fmMM-fmDD HH24:MI:SS');
insert into stockmarket values(stock_code,stock_name,stock_shortname,stock_buydate);
end loop;
commit;
exception
when quantity then
raise_application_error(-20010,'請核對該xml文檔與數據庫表Stockmarket的結構是否一致,'
||chr(10)||'若仍不能解決問題,請與系統管理員聯系!');
end;
導出:
/************************************************************************************************************
存儲過程名稱:up_exptoxml
參數1:XMLfilepath in varchar2 接收將要生成的文件名(可帶路徑)
參數2:sqlQuery in varchar2 接收用戶輸入的查詢字符串,默認值為:"select * from stockmarket"
參數3:flag in varchar2 標志位,說明第二個參數的來源(即由用戶輸入還是來自于文件)默認值:
"sql",即由用戶輸入
使用方法:
1、默認方式:exec up_exptoxml(xmlfilepath) //將stockmarket表中的數據全部取出
保存到參數xmlfilepath指定的文件中
2、用戶指定查詢語句方式:
//將用戶指定的查詢語句所生成的結果集保存到參數xmlfilepath所指定的文件中
1)exec up_exptoxml(xmlfilepath,'select stockname,buydate from stockmarket')
//如果用戶認為查詢語句過長,直接輸入不方便,也可以將語句保存成*.txt文件,
//存儲過程執行方式如下:
2)exec up_exptoxml(xmlfilepath,'filepath,filename','file');
該方式下存儲過程將指定目錄,指定文件中的sql語句讀出并執行,將所生成的結果集保存到參數xmlfilepath
所指定的文件中
功能:按照用戶要求將查詢結果保存為xml文件
************************************************************************************************************/
create or replace procedure up_exptoxml(XMLfilepath in varchar2, sqlQuery varchar2:='select * from stockmarket',flag varchar2:='sql') is
sqlstr_from_file clob;--保存sql查詢字符串
document xmldom.DOMDocument;--文檔對象
rootelement xmldom.DOMElement;--根元素
stockRecord xmldom.DOMElement;--記錄
stockfield xmldom.DOMElement;--字段
l_cursor integer;--存儲游標變量返回值
l_col_cot integer;--游標所包含的列數
l_desc_tab dbms_sql.desc_tab;--定義desc_tab類型的集合
tempfield dbms_sql.Varchar2_Table;--定義Varchar2_Table類型的集合
tempdate dbms_sql.Date_Table;--定義Date_Table類型的集合
tempnode xmldom.DOMNode;--定義臨時節點
text xmldom.DOMText;--定義文本節點
executenum integer;--存儲游標執行返回值
--fieldvalue varchar2(50);
sqlfile utl_file.file_type;
parameter exception;--自定義異常
begin
if upper(flag)<>'SQL'and upper(flag)<>'FILE' then
raise parameter;--如果flag參數不為上述兩個選項,則拋出參數異常
elsif upper(flag)='SQL' then
sqlstr_from_file:=sqlQuery;
else
--調用存儲過程以讀取文件中存放的sql查詢字符串
readFile(sqlQuery,sqlstr_from_file);
end if;
l_cursor:=dbms_sql.open_cursor;
dbms_sql.parse(l_cursor,sqlstr_from_file,dbms_sql.native);--解析游標
dbms_sql.describe_columns(l_cursor,l_col_cot,l_desc_tab);--獲取列描述信息
for def in 1..l_col_cot loop
if l_desc_tab(def).col_type=1 then
tempfield(def):='';--初始化集合元素
dbms_sql.define_column(l_cursor,def,tempfield(def),50);--定義列
else
tempdate(def):=sysdate;--初始化集合元素
dbms_sql.define_column(l_cursor,def,tempdate(def));--定義列
end if;
end loop;
executenum:=dbms_sql.execute(l_cursor);--執行游標
document:=xmldom.newDOMDocument;--生成文檔對象
rootelement:=xmldom.createElement(document,'StockTable');--生成根元素
loop--循環結果集(列方向)
if dbms_sql.fetch_rows(l_cursor)>0 then
stockrecord:=xmldom.createElement(document,'Stock');--建立臨時記錄元素
for i in 1..l_col_cot loop--(循環列,行方向)
stockfield:=xmldom.createElement(document,l_desc_tab(i).col_name);--建立字段元素
if l_desc_tab(i).col_type=1 then--col_type=1 表示varchar2類型
--dbms_sql.define_column(l_cursor,i,tempfield(i),50);
dbms_sql.column_value(l_cursor,i,tempfield(i));
text:=xmldom.createTextNode(document,tempfield(i));
else --col_type=12 表示date類型
--dbms_sql.define_column(l_cursor,i,tempdate(i));
dbms_sql.column_value(l_cursor,i,tempdate(i));
text:=xmldom.createTextNode(document,to_char(tempdate(i),'yyyy-mm-dd HH24:MI:SS'));
end if;
--將文本節點添加到字段節點
tempnode:=xmldom.appendChild(xmldom.makeNode(stockfield),xmldom.makeNode(text));
--將字段節點添加到記錄節點
tempnode:=xmldom.appendChild(xmldom.makeNode(stockrecord),xmldom.makeNode(stockfield));
end loop;
--將記錄節點添加到根節點
tempnode:=xmldom.appendChild(xmldom.makeNode(rootelement),xmldom.makeNode(stockrecord));
else
--no more row to copy
dbms_sql.close_cursor(l_cursor);--遍歷游標結束,關閉游標
exit;
end if;
end loop;
--將根節點添加到文檔
tempnode:=xmldom.appendChild(xmldom.makeNode(document),xmldom.makeNode(rootelement));
xmldom.setVersion(document,'1.0');
xmldom.writeToFile(document,XMLfilepath);
exception
when parameter then
raise_application_error(-20004,'必須以"sql"或者"file"方式指定sql語句的來源');
when others then
if dbms_sql.is_open(l_cursor) then
dbms_sql.close_cursor(l_cursor);
end if;
raise_application_error(-20005,'未知異常,游標已關閉!');
end up_exptoxml;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -