以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XML 与 数据库 』  (http://bbs.xml.org.cn/list.asp?boardid=17)
----  关于xml数据导入oracle的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=17&rootid=&id=35861)


--  作者:bxhe
--  发布时间:7/20/2006 7:58:00 PM

--  关于xml数据导入oracle的问题
本人正在做毕业设计,是建立一个中医药的数据库。我用的dbms是oracle。我先用sybase powerdesigner设计了一个针对oracle的物理数据模型(pdm),然后生成sql脚本,这样我就可以在oracle建立数据库了。我的数据来源是从几个中医药网站,取有用的信息综合出来数据,我想根据我的pdm再设计一个xml结构(文档),然后把从各网站上的数据摘下来填到xml里,然后再(批量)转到oracle里,但是我目前的想法都是停留在思路上的,不知道如何去实现,想请各位高手帮忙出出主意,或给点思路。万分感谢!
--  作者:k11
--  发布时间:9/13/2006 12:38:00 AM

--  
你是手动传数据,还是自动的转数据?手动最简单的办法,把数据拷到EXCEL里面,然后用工具就可以批量的插到ORACLE里面。自动的话,偶也是刚刚才研究XML,偶也不知道!
--  作者:caizhiheng
--  发布时间:4/11/2007 12:19:00 PM

--  小问题嘛!!
-- 解析 XML people.xml 文件的内容并保存到数据库表 PEOPLE 中
-- 以 SCOTT 用户登录 ORACLE 系统
-- 请先根据 xml 文件的内容创建 PEOPLE 表
--

set serveroutput on;
set echo on;

create or replace procedure xml2table(dir varchar2, inpfile varchar2,
                                      errfile 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
   -- 读取 PERSON 元素
   nl := xmldom.getElementsByTagName(doc, 'PERSON');
   len := xmldom.getLength(nl);

   -- 遍历元素
   for i in 0..len-1 loop
      -- 构造动态 SQL 语句
      strSQL := 'INSERT INTO PEOPLE VALUES (';
      n := xmldom.item(nl, i);
      if xmldom.getNodeName(n)='PERSON' then
         nnm := xmldom.getAttributes(n);  -- 读取 PERSONID 属性
         attn := xmldom.item(nnm, 0);
         strSQL := strSQL || '''' || xmldom.getNodeValue(attn) || '''';
      end if;

      -- 读取 PERSON 的子节点
      nl2 := xmldom.getChildNodes(n);
      len2 := xmldom.getLength(nl2);

      -- 处理 NAME, ADDRESS, ... 等节点
      for j in 0..len2-1 loop
         n := xmldom.item(nl2, j);
         strSQL := strSQL || ', ''' || xmldom.getNodeValue(xmldom.getFirstChild(n)) || '''';
      end loop;
      -- 完成 动态 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('读取文档元素并保存到表 PEOPLE 中.');
   readElements(doc);

-- 释放资源
   xmldom.freeDocument(doc);

end xml2table;
/
show errors;
-- exec xml2table('d:\xml\plsql', 'people.xml', 'err.log');

begin
 xml2table('PROJECT_ONE','T31_PEOPLE.XML', 'ERR.log');
end;


--  作者:caizhiheng
--  发布时间:4/11/2007 12:20:00 PM

--  小问题嘛!!
-- 解析 XML people.xml 文件的内容并保存到数据库表 PEOPLE 中
-- 以 SCOTT 用户登录 ORACLE 系统
-- 请先根据 xml 文件的内容创建 PEOPLE 表
--

set serveroutput on;
set echo on;

create or replace procedure xml2table(dir varchar2, inpfile varchar2,
                                      errfile 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
   -- 读取 PERSON 元素
   nl := xmldom.getElementsByTagName(doc, 'PERSON');
   len := xmldom.getLength(nl);

   -- 遍历元素
   for i in 0..len-1 loop
      -- 构造动态 SQL 语句
      strSQL := 'INSERT INTO PEOPLE VALUES (';
      n := xmldom.item(nl, i);
      if xmldom.getNodeName(n)='PERSON' then
         nnm := xmldom.getAttributes(n);  -- 读取 PERSONID 属性
         attn := xmldom.item(nnm, 0);
         strSQL := strSQL || '''' || xmldom.getNodeValue(attn) || '''';
      end if;

      -- 读取 PERSON 的子节点
      nl2 := xmldom.getChildNodes(n);
      len2 := xmldom.getLength(nl2);

      -- 处理 NAME, ADDRESS, ... 等节点
      for j in 0..len2-1 loop
         n := xmldom.item(nl2, j);
         strSQL := strSQL || ', ''' || xmldom.getNodeValue(xmldom.getFirstChild(n)) || '''';
      end loop;
      -- 完成 动态 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('读取文档元素并保存到表 PEOPLE 中.');
   readElements(doc);

-- 释放资源
   xmldom.freeDocument(doc);

end xml2table;
/
show errors;
-- exec xml2table('d:\xml\plsql', 'people.xml', 'err.log');

begin
 xml2table('PROJECT_ONE','T31_PEOPLE.XML', 'ERR.log');
end;


--  作者:lit0302
--  发布时间:4/20/2007 1:13:00 AM

--  
有没有用jdom方法把xml导入数据库的啊
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
81.055ms