仿照網上的一個過程函數改編,但是我的數據庫了因為有date類型,所以,改成了如下:create or replace procedure xml2tblbasewpnlcut(dir varchar2,
inpfile varchar2) is
-- 參數說明:
-- dir 基本目錄,如 'd:\xml\plsql'
-- inpfile 輸入檔案名,不含路徑,如 'people.xml'
-- errfile 錯誤日誌檔,保存解析錯誤資訊, 如 'err.log'
p xmlparser.parser;
doc xmldom.DOMDocument;
-- 讀取並處理文檔元素
procedure readElements(doc xmldom.DOMDocument) is
nl xmldom.DOMNodeList;
len number;
n xmldom.DOMNode;
-- attn xmldom.DOMNode;
-- nnm xmldom.DOMNamedNodeMap;
nl2 xmldom.DOMNodeList;
len2 number;
strSQL varchar2(1000);
begin
nl := xmldom.getElementsByTagName(doc, 'TBLENGBASEWPNLCUT');
len := xmldom.getLength(nl);
-- 遍曆元素
for i in 0 .. len - 1 loop
-- 構造動態 SQL 語句
strSQL := 'INSERT INTO TBLENGBASEWPNLCUT VALUES (';
--n := xmldom.item(nl, i);
/* if xmldom.getNodeName(n)='book' then
nnm := xmldom.getAttributes(n);
attn := xmldom.item(nnm, 0);
strSQL := strSQL || '''' || xmldom.getNodeValue(attn) || '''';
end if; */
-- 讀取 PERSON 的子節點
nl2 := xmldom.getChildNodes(n);
len2 := xmldom.getLength(nl2);
-- 處理 NAME, ADDRESS, ... 等節點
n := xmldom.item(nl2, 0);
strSQL := strSQL || '''' ||
xmldom.getNodeValue(xmldom.getFirstChild(n)) || ''''; for j in 1 .. len2 - 5 loop
n := xmldom.item(nl2, j);
strSQL := strSQL || ', ''' ||
xmldom.getNodeValue(xmldom.getFirstChild(n)) || '''';
end loop; n := xmldom.item(nl2, len2 - 4);
strSQL := strSQL || ', ''' ||
to_data(xmldom.getNodeValue(xmldom.getFirstChild(n)),
'YYYY/MM/DD HH24:MI:SS') || ''''; n := xmldom.item(nl2, len2 - 3);
strSQL := strSQL || ', ''' ||
xmldom.getNodeValue(xmldom.getFirstChild(n)) || ''''; n := xmldom.item(nl2, len2 - 2);
strSQL := strSQL || ', ''' ||
to_data(xmldom.getNodeValue(xmldom.getFirstChild(n)),
'YYYY/MM/DD HH24:MI:SS') || ''''; n := xmldom.item(nl2, len2 - 1);
strSQL := strSQL || ', ''' ||
xmldom.getNodeValue(xmldom.getFirstChild(n)) || ''''; -- 完成 動態 SQL 語句的構造
strSQL := strSQL || ')';
-- dbms_output.put_line(strSQL);
-- 執行插入記錄的 SQL 語句
execute immediate (strSQL); -- 執行動態 SQL
end loop;
commit; -- 提交插入
dbms_output.put_line('');
end readElements;
begin
-- 新建解析器實例
p := xmlparser.newParser;
-- 設置解析器特性
xmlparser.setValidationMode(p, FALSE);
-- xmlparser.setErrorLog(p, dir || '\' || errfile);
xmlparser.setBaseDir(p, dir);
-- 解析輸入檔
xmlparser.parse(p, dir || '\' || inpfile);
-- 獲取解析後的文檔對象
doc := xmlparser.getDocument(p);
-- 讀取文檔元素
dbms_output.put_line('讀取文檔元素並保存到表 TBLENGBASEWPNLCUT 中.');
readElements(doc);
-- 釋放資源
xmldom.freeDocument(doc);
end xml2tblbasewpnlcut;編譯的時候都能夠編譯,但是執行確是無效的。究竟錯在哪里呢?不知道哪位知道原因,謝謝!!
另:xml文檔如下:
<?xml version="1.0" encoding="utf-16"?>
<!-- edited with XMLSpy v2008 rel. 2 sp1 (http://www.altova.com) by wanghui (tj) -->
<ROWDATA>
<TBLENGBASEWPNLCUT>
<WPNLLENGTH>622.000</WPNLLENGTH>
<WPNLWIDE>518.000</WPNLWIDE>
<SHITLENGTH>49</SHITLENGTH>
<SHITWIDE>41</SHITWIDE>
<LAMCUTID>1</LAMCUTID>
<BACKYN>N</BACKYN>
<CUTFILENAME>C14_JUDY.BMP</CUTFILENAME>
<CREATOR>071801</CREATOR>
<CREATEDATE>2008-07-18 10:32:18</CREATEDATE>
<REVISER>071801</REVISER>
<REVISEDATE>2008-07-18 10:33:08</REVISEDATE>
<MEMO/>
</TBLENGBASEWPNLCUT>
<TBLENGBASEWPNLCUT>
<WPNLLENGTH>600.000</WPNLLENGTH>
<WPNLWIDE>500.000</WPNLWIDE>
<SHITLENGTH>49</SHITLENGTH>
<SHITWIDE>41</SHITWIDE>
<LAMCUTID>1</LAMCUTID>
<BACKYN>N</BACKYN>
<CUTFILENAME>C14_JUDY.BMP</CUTFILENAME>
<CREATOR>071801</CREATOR>
<CREATEDATE>2008-07-18 10:32:18</CREATEDATE>
<REVISER>071801</REVISER>
<REVISEDATE>2008-07-18 10:33:08</REVISEDATE>
<MEMO/>
</TBLENGBASEWPNLCUT>
</ROWDATA>
inpfile varchar2) is
-- 參數說明:
-- dir 基本目錄,如 'd:\xml\plsql'
-- inpfile 輸入檔案名,不含路徑,如 'people.xml'
-- errfile 錯誤日誌檔,保存解析錯誤資訊, 如 'err.log'
p xmlparser.parser;
doc xmldom.DOMDocument;
-- 讀取並處理文檔元素
procedure readElements(doc xmldom.DOMDocument) is
nl xmldom.DOMNodeList;
len number;
n xmldom.DOMNode;
-- attn xmldom.DOMNode;
-- nnm xmldom.DOMNamedNodeMap;
nl2 xmldom.DOMNodeList;
len2 number;
strSQL varchar2(1000);
begin
nl := xmldom.getElementsByTagName(doc, 'TBLENGBASEWPNLCUT');
len := xmldom.getLength(nl);
-- 遍曆元素
for i in 0 .. len - 1 loop
-- 構造動態 SQL 語句
strSQL := 'INSERT INTO TBLENGBASEWPNLCUT VALUES (';
--n := xmldom.item(nl, i);
/* if xmldom.getNodeName(n)='book' then
nnm := xmldom.getAttributes(n);
attn := xmldom.item(nnm, 0);
strSQL := strSQL || '''' || xmldom.getNodeValue(attn) || '''';
end if; */
-- 讀取 PERSON 的子節點
nl2 := xmldom.getChildNodes(n);
len2 := xmldom.getLength(nl2);
-- 處理 NAME, ADDRESS, ... 等節點
n := xmldom.item(nl2, 0);
strSQL := strSQL || '''' ||
xmldom.getNodeValue(xmldom.getFirstChild(n)) || ''''; for j in 1 .. len2 - 5 loop
n := xmldom.item(nl2, j);
strSQL := strSQL || ', ''' ||
xmldom.getNodeValue(xmldom.getFirstChild(n)) || '''';
end loop; n := xmldom.item(nl2, len2 - 4);
strSQL := strSQL || ', ''' ||
to_data(xmldom.getNodeValue(xmldom.getFirstChild(n)),
'YYYY/MM/DD HH24:MI:SS') || ''''; n := xmldom.item(nl2, len2 - 3);
strSQL := strSQL || ', ''' ||
xmldom.getNodeValue(xmldom.getFirstChild(n)) || ''''; n := xmldom.item(nl2, len2 - 2);
strSQL := strSQL || ', ''' ||
to_data(xmldom.getNodeValue(xmldom.getFirstChild(n)),
'YYYY/MM/DD HH24:MI:SS') || ''''; n := xmldom.item(nl2, len2 - 1);
strSQL := strSQL || ', ''' ||
xmldom.getNodeValue(xmldom.getFirstChild(n)) || ''''; -- 完成 動態 SQL 語句的構造
strSQL := strSQL || ')';
-- dbms_output.put_line(strSQL);
-- 執行插入記錄的 SQL 語句
execute immediate (strSQL); -- 執行動態 SQL
end loop;
commit; -- 提交插入
dbms_output.put_line('');
end readElements;
begin
-- 新建解析器實例
p := xmlparser.newParser;
-- 設置解析器特性
xmlparser.setValidationMode(p, FALSE);
-- xmlparser.setErrorLog(p, dir || '\' || errfile);
xmlparser.setBaseDir(p, dir);
-- 解析輸入檔
xmlparser.parse(p, dir || '\' || inpfile);
-- 獲取解析後的文檔對象
doc := xmlparser.getDocument(p);
-- 讀取文檔元素
dbms_output.put_line('讀取文檔元素並保存到表 TBLENGBASEWPNLCUT 中.');
readElements(doc);
-- 釋放資源
xmldom.freeDocument(doc);
end xml2tblbasewpnlcut;編譯的時候都能夠編譯,但是執行確是無效的。究竟錯在哪里呢?不知道哪位知道原因,謝謝!!
另:xml文檔如下:
<?xml version="1.0" encoding="utf-16"?>
<!-- edited with XMLSpy v2008 rel. 2 sp1 (http://www.altova.com) by wanghui (tj) -->
<ROWDATA>
<TBLENGBASEWPNLCUT>
<WPNLLENGTH>622.000</WPNLLENGTH>
<WPNLWIDE>518.000</WPNLWIDE>
<SHITLENGTH>49</SHITLENGTH>
<SHITWIDE>41</SHITWIDE>
<LAMCUTID>1</LAMCUTID>
<BACKYN>N</BACKYN>
<CUTFILENAME>C14_JUDY.BMP</CUTFILENAME>
<CREATOR>071801</CREATOR>
<CREATEDATE>2008-07-18 10:32:18</CREATEDATE>
<REVISER>071801</REVISER>
<REVISEDATE>2008-07-18 10:33:08</REVISEDATE>
<MEMO/>
</TBLENGBASEWPNLCUT>
<TBLENGBASEWPNLCUT>
<WPNLLENGTH>600.000</WPNLLENGTH>
<WPNLWIDE>500.000</WPNLWIDE>
<SHITLENGTH>49</SHITLENGTH>
<SHITWIDE>41</SHITWIDE>
<LAMCUTID>1</LAMCUTID>
<BACKYN>N</BACKYN>
<CUTFILENAME>C14_JUDY.BMP</CUTFILENAME>
<CREATOR>071801</CREATOR>
<CREATEDATE>2008-07-18 10:32:18</CREATEDATE>
<REVISER>071801</REVISER>
<REVISEDATE>2008-07-18 10:33:08</REVISEDATE>
<MEMO/>
</TBLENGBASEWPNLCUT>
</ROWDATA>
另外一個問題就是,如果解析到了空值,該如何插入??