想请教一下大家,如何使用sqlloader导入xml文件到Oracle数据库?
想就使用oracle的工具,不用其他程序实现
请大家帮忙!谢谢

解决方案 »

  1.   

    xml文件?需要分别导入到不同字段,还是把该文件所有内容都导入一lob字段?另外,XML文件好象没有固定格式吧。我是指如果多字段,之间需要有统一的分隔符。
      

  2.   

    是要分别倒是不同的字段的,不是整个内容导入一个lob字段中,
    能实现吗?谢谢
      

  3.   

    在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程 
    学校里要求做个题,题目要求是写出将已知格式xml文件中的数据导入Oracle数据库、把数据库中的数据导出成xml文件的过程。
    已知格式xml文件如下:<?xml version="1.0"?>
    <PEOPLE>
        <PERSON PERSONID="E01">
            <NAME>Tony Blair</NAME>
            <ADDRESS>10 Downing Street, London, UK</ADDRESS>
            <TEL>(061) 98765</TEL><FAX>(061) 98768</FAX>
            <EMAIL>[email protected]</EMAIL>
        </PERSON>
        <PERSON PERSONID="E02">
            <NAME>Bill Clinton</NAME>
            <ADDRESS>White House, USA</ADDRESS>
            <TEL>(001) 6400 98765</TEL><FAX>(001) 6400 98769</FAX>
            <EMAIL>[email protected]</EMAIL>
        </PERSON>
        <PERSON PERSONID="E03">
            <NAME>Tom Cruise</NAME>
            <ADDRESS>57 Jumbo Street, New York, USA</ADDRESS>
            <TEL>(001) 4500 67859</TEL><FAX>(001) 4500 67895</FAX>
            <EMAIL>[email protected]</EMAIL>
        </PERSON>
        <PERSON PERSONID="E04">
            <NAME>Linda Goodman</NAME>
            <ADDRESS>78 Crax Lane, London, UK</ADDRESS>
            <TEL>(061) 54 56789</TEL><FAX>(061) 54 56772</FAX>
            <EMAIL>[email protected]</EMAIL>
        </PERSON>
    </PEOPLE>于是写出过程如下:
    --建表
    CREATE TABLE PEOPLE
    (
       PERSONID VARCHAR2(10) PRIMARY KEY,
       NAME VARCHAR2(20),
       ADDRESS VARCHAR2(60),
       TEL  VARCHAR2(20),
       FAX  VARCHAR2(20),
       EMAIL VARCHAR2(40)
    );
    --从xml文件载入数据保存到数据库的过程 
    create or replace procedure xml2db(xmlfile varchar2) as
      p xmlparser.Parser;
      doc xmldom.DOMDocument;
      n xmldom.DOMNode;
      nl xmldom.DOMNodeList;
      len number;
      --根据PERSON结点生成插入SQL语句的过程 
      function insertsql(node xmldom.DOMNode) return varchar2
      is
        n xmldom.DOMNode;
        nl xmldom.DOMNodeList;
        len number;
        nnm xmldom.DOMNamedNodeMap;
        isql varchar2(200);
      begin
        --取得PERSON结点所有属性 
        nnm := xmldom.getAttributes(node);
        isql := 'insert into people values(';
        isql := isql || '''';
        --取得所有属性中的第一个属性,即"PERSONID",并拼接到SQL语句中 
        isql := isql || xmldom.getNodeValue(xmldom.item(nnm,0));
        isql := isql || '''';
        --取得PERSON结点下的所有结点,准备遍历 
        nl := xmldom.getChildNodes(node);
        len := xmldom.getLength(nl);
        for i in 0..len-1 loop
          --取出第i个结点 
          n := xmldom.item(nl,i);
          isql := isql || ',';
          isql := isql || '''';
          --将结点的文本值取出并拼接到SQL语句中
          isql := isql || xmldom.getNodeValue(xmldom.getFirstChild(n));
          isql := isql || '''';
        end loop;
        isql := isql || ')';
        return isql;
      end insertsql;
    begin
      p := xmlparser.newParser;
      xmlparser.parse(p,xmlfile);
      --转换xml文件成DOM对像 
      doc := xmlparser.getDocument(p);
      xmlparser.freeParser(p);
      --取出所有PERSON元素 
      nl := xmldom.getElementsByTagName(doc,'PERSON');
      len := xmldom.getLength(nl);
      --清空people表的内容 
      delete from people;
      for i in 0..len-1 loop
        --取出第i个PERSON元素 
        n := xmldom.item(nl,i);
        --执行插入该PERSON元素所用的SQL语句 
        execute immediate insertsql(n);
      end loop;
      commit;
      xmldom.freeDocument(doc);
    end xml2db;
    /
    --将数据库中的数据导出成xml文件的过程 
    create or replace procedure db2xml(xmlfile varchar2) as
      doc xmldom.DOMDocument;
      ret xmldom.DOMNode;
      peoplenode xmldom.DOMNode;
      --遍历整个people表的游标 
     -------------
      --将people表中一行记录转换为元素
      --并插入到DOM文档对像根结点PEOPLE下的过程 
      procedure addperson(doc xmldom.DOMDocument,people xmldom.DOMNode,
                          v_pid varchar2,v_name varchar2,v_addr varchar2,
                          v_tel varchar2,v_fax varchar2,v_email varchar2)
      is
        personelem xmldom.DOMElement;
        personnode xmldom.DOMNode;
        itemelem xmldom.DOMElement;
        itemnode xmldom.DOMNode;
        text xmldom.DOMText;
      begin
        --创建PERSON结点 
        personelem := xmldom.createElement(doc,'PERSON');
        --设置PERSONID属性 
        xmldom.setAttribute(personelem,'PERSONID',v_pid);
        personnode := xmldom.appendChild(peoplenode,xmldom.makeNode(personelem));
        --向PERSON结点中添加NAME元素
        itemelem := xmldom.createElement(doc,'NAME');
        --  将NAME结点添加到PERSON结点中
        itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
        --  创建文本结点
        text := xmldom.createTextNode(doc,v_name);
        --  将文本结点添加到NAME结点下,以构成完整NAME元素
        itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
        --向PERSON结点中添加ADDRESS元素
        itemelem := xmldom.createElement(doc,'ADDRESS');
        itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
        text := xmldom.createTextNode(doc,v_addr);
        itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
        --向PERSON结点中添加TEL元素
        itemelem := xmldom.createElement(doc,'TEL');
        itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
        text := xmldom.createTextNode(doc,v_tel);
        itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
        --向PERSON结点中添加FAX元素
        itemelem := xmldom.createElement(doc,'FAX');
        itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
        text := xmldom.createTextNode(doc,v_fax);
        itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
        --向PERSON结点中添加EMAIL元素
        itemelem := xmldom.createElement(doc,'EMAIL');
        itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
        text := xmldom.createTextNode(doc,v_email);
        itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
      end addperson;
    begin
      --创建一个新DOM文档对像 
      doc := xmldom.newDOMDocument;
      --为文档添加根结点PEOPLE
      peoplenode := xmldom.makeNode(xmldom.createElement(doc,'PEOPLE'));
      ret := xmldom.appendChild(xmldom.makeNode(doc),peoplenode);
      --使用游标遍历people中的每行,生成每一行对应的PERSON元素并添加到PEOPLE根结点中
      for v_row in cur_people loop
        addperson(doc,peoplenode,v_row.personid,v_row.name,
                  v_row.address,v_row.tel,v_row.fax,v_row.email);
      end loop;
      --将结果写入指定文件 
      xmldom.writeToFile(doc,xmlfile);
      xmldom.freeDocument(doc);
    end db2xml;
      

  4.   

    系统环境:  
    1、操作系统:Windows 2000 Server,机器内存128M 
    2、数据库: Oracle 8i R2 (8.1.6) for NT 企业版 
    3、安装路径:C:\ORACLE 
      
    实现步骤:  
      
    1、打开MicroSoft Excel 2000 
      
    2、文件(F)→新建(N)→工作簿→ 
      
    3、输入以下数据,存盘为test.xls,如图: 
      
     
      
    4、文件(F)→另存为(A)→ 
      
    保存类型为:制表符分隔,起名为text.txt,保存到C:\ 
      
     
      
    5、连入SQL*Plus 
    以system/manager用户登录, 
    SQL> conn system/manager 
      
    创建表结构 
    SQL> create table test 
        ( 
        id       number,        --序号 
        username    varchar2(10),     --用户名 
        password    varchar2(10),     --密码 
        sj       varchar2(20)      --建立日期 
        ); 
      
    6、创建SQL*Loader输入数据所需要的文件,均保存到C:\,用记事本编辑: 
    控制文件:input.ctl,内容如下: 
      
      load data           --1、控制文件标识 
      infile 'test.txt'       --2、要输入的数据文件名为test.txt 
      append into table test    --3、向表test中追加记录 
      fields terminated by X'09'  --4、字段终止于X'09',是一个制表符(TAB) 
      (id,username,password,sj)   -----定义列对应顺序 
      
    a、insert,为缺省方式,在数据装载开始时要求表为空 
    b、append,在表中追加新记录 
    c、replace,删除旧记录,替换成新装载的记录 
    d、truncate,同上 
      
    7、在DOS窗口下使用SQL*Loader命令实现数据的输入 
      
    C:\>sqlldr userid=system/manager control=input.ctl 
      
     
      
      默认日志文件名为:input.log 
      默认坏记录文件为:input.bad 
      
    8、连接到SQL*Plus中,查看是否成功输入