我想把XML中的元素写入ORACLE数据库 应该怎么办?有没有简单一点的办法
比如说:
XML<root>
  <company>
      <ID>0001</ID>
      <NAME>ORACLE</NAME>
      <COUNTRY>
         <COUNTRY_CODE>USA</COUNTRY_CODE>
         <COUNTRY_CODE>CHINA</COUNTRY_CODE>
         <COUNTRY_CODE>UK</COUNTRY_CODE>
      </COUNTRY>
  </company>
</root>数据库中有两张表  插入数据后应该是
表名 COMPANY_INFO
字段  ID   NAME
     0001  ORACLE表名     COMPANY_COUNTRY
字段名   ID      COUNTRY_CODE
        0001       USA
        0001       CHINA
        0001       UK关键在于怎么写程序实现效率最高?最好是C#

解决方案 »

  1.   

    XML数据库,专用于存放XML数据的,这个技术ORACLE应该有
      

  2.   

    http://www.oracle.com/technology/global/cn/tech/xml/xmldb/index.html
    看看这个连接。
      

  3.   

    写过存储过程把xml通过xmltype类型进行解析,然后分别insert到对应的表,思路就是这样了。
      

  4.   

    利用Oracle的系统包xmldom, xmlparse的过程可以把XML文件转到Oracle中
      

  5.   

    用XMLTYPE类型对XML解析:/*   XML file detail<company CID="1"> 
          <ID>0001</ID> 
          <NAME>ORACLE</NAME> 
          <COUNTRY CTID="1"> 
            <COUNTRY_CODE>USA</COUNTRY_CODE> 
            <COUNTRY_CODE>CHINA</COUNTRY_CODE> 
            <COUNTRY_CODE>UK</COUNTRY_CODE> 
          </COUNTRY> 
    </company>*/CREATE DIRECTORY XMLDIR AS 'C:\oracle\XMLDIRTY';
    CREATE TABLE CLOB_TABLE (CID NUMBER,CONTENT CLOB);CREATE TABLE XMLCONTENT (XMLID NUMBER PRIMARY KEY, XMLVALUE XMLTYPE);INSERT INTO CLOB_TABLE(CID) VALUES(1);  --CONTENT列没有定位器,并且没有数据
    INSERT INTO CLOB_TABLE VALUES(2,'THE CONENT WORK FOR CID 2');  --CONTENT列有定位器,并且有数据
    INSERT INTO CLOB_TABLE VALUES(3,EMPTY_CLOB());--CONTENT含有定位器,但是没有数据COMMIT;-- 用下面的函数把XML文件转换成CLOB对象,然后使用XMLTYPE类型插入并保存在表XMLCONTENT中./*
        Author: mantisXF
        Date: Sep 6, 2008
    */CREATE OR REPLACE FUNCTION GET_CLOB_FROM_XML(FILENAME IN VARCHAR2,
                                             CHARSET IN VARCHAR2 DEFAULT NULL
                                            )RETURN CLOB DETERMINISTIC
    IS
    -- DECLARE VARIABLE E.G: CLOB,FILENAME
      V_XML_FILE BFILE := BFILENAME('XMLDIRTY',FILENAME);
      -- WORK FOR CONVENTING XML FILE TO CLOB OBJECT
      V_CLOBCONTENT CLOB;
      V_LANG_CTX NUMBER := DBMS_LOB.DEFAULT_LANG_CTX;
      V_CHARSETID NUMBER := 0;
      V_SRC_OFFSET NUMBER := 1;
      V_DST_OFFSET NUMBER := 1;
      V_WARNING NUMBER;
      
      V_STEP VARCHAR2(100) := '';
      
    BEGIN
      V_STEP := 'DECIDE WHETHER CHARSET IS REQUIRED';
      IF CHARSET IS NOT NULL THEN
        V_CHARSETID := NLS_CHARSET_ID(CHARSET);
      END IF;
      
      V_STEP := 'MAKE LOB LOCATOR CAN HAVE THE PLACE BY SELECTING RESULT FROM CLOB_TABLE';
      SELECT NVL(CONTENT,EMPTY_CLOB()) INTO V_CLOBCONTENT FROM CLOB_TABLE WHERE CID = 1 FOR UPDATE;
      
      V_STEP := 'OPENING XML FILE';
      DBMS_LOB.FILEOPEN(V_XML_FILE,DBMS_LOB.FILE_READONLY);
      
      V_STEP := 'CONVERTING XML FILE TO CLOB OBJECT';
      DBMS_LOB.LOADCLOBFROMFILE(V_CLOBCONTENT,V_XML_FILE,DBMS_LOB.GETLENGTH(V_XML_FILE),V_SRC_OFFSET,V_DST_OFFSET,V_CHARSETID,V_LANG_CTX,V_WARNING);
      
      V_STEP := 'CLOSING XML FILE OBJECT';
      DBMS_LOB.FILECLOSE(V_XML_FILE);
      
      RETURN V_CLOBCONTENT;
      
    EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Error at: '|| V_STEP);
      DBMS_OUTPUT.PUT_LINE(SQLCODE || ' : ' || SQLERRM);
        
    END;
    -- 操作XMLTYPE类型的XML中的数据SQL> INSERT INTO XMLCONTENT VALUES(1,XMLTYPE(GET_CLOB_FROM_XML('company.xml','UTF8')));1 row insertedSQL> COMMIT;Commit completeSQL> SQL> SELECT EXTRACTVALUE(xmlvalue,'/company/COUNTRY/COUNTRY_CODE[1]')
      2    FROM XMLCONTENT
      3   WHERE XMLID = 1;EXTRACTVALUE(XMLVALUE,'/COMPAN
    --------------------------------------------------------------------------------
    USASQL> 
    SQL> SELECT EXTRACT(xmlvalue,'/company/COUNTRY')
      2    FROM XMLCONTENT
      3   WHERE XMLID = 1;EXTRACT(XMLVALUE,'/COMPANY/COU
    --------------------------------------------------------------------------------
    <COUNTRY CTID="1">
      <COUNTRY_CODE>USA</COUNTRY_CODE>
      <COUNTRY_CODE>CHINA</COUNTRY_CODE>
      <COUNTRY_CODE>UK</COUNTRY_CODE>
    </COUNTRY>
    SQL> 
    SQL> SELECT EXTRACTVALUE(xmlvalue,'/company/COUNTRY/text()')
      2    FROM XMLCONTENT
      3   WHERE XMLID = 1;EXTRACTVALUE(XMLVALUE,'/COMPAN
    --------------------------------------------------------------------------------SQL> 
    SQL> SELECT extractValue(xmlvalue, '/company/COUNTRY/COUNTRY_CODE[1]/text()')
      2    FROM XMLCONTENT
      3   WHERE XMLID = 1
      4     AND existsNode(xmlvalue, '/company/COUNTRY[COUNTRY_CODE="USA"]')
      5          = 1;EXTRACTVALUE(XMLVALUE,'/COMPAN
    --------------------------------------------------------------------------------
    USASQL> 
    SQL> SELECT existsNode(xmlvalue, '/company/COUNTRY[COUNTRY_CODE="USA"]')
      2    FROM XMLCONTENT
      3   WHERE XMLID = 1;EXISTSNODE(XMLVALUE,'/COMPANY/
    ------------------------------
                                 1SQL> 
    SQL> SELECT EXTRACT(XMLVALUE,'/company/@CID').getNumberVal()
      2    FROM XMLCONTENT
      3   WHERE XMLID = 1;EXTRACT(XMLVALUE,'/COMPANY/@CI
    ------------------------------
                                 1SQL> 
    SQL> SELECT extract(xmlvalue, '/company/COUNTRY/COUNTRY_CODE[1]/text()').getStringVal()
      2    FROM XMLCONTENT
      3   WHERE XMLID = 1;EXTRACT(XMLVALUE,'/COMPANY/COU
    --------------------------------------------------------------------------------
    USASQL> 
    SQL> SELECT EXTRACT(XMLVALUE,'/company/NAME/text()').getStringVal()
      2    FROM XMLCONTENT
      3   WHERE XMLID = 1;EXTRACT(XMLVALUE,'/COMPANY/NAM
    --------------------------------------------------------------------------------
    ORACLESQL> 
    SQL> UPDATE XMLCONTENT
      2     SET xmlvalue = updateXML(xmlvalue,'/company/NAME/text()','mantisXF')
      3   WHERE XMLID = 1
      4     AND EXISTSNODE(xmlvalue,'/company[NAME="ORACLE"]') = 1;1 row updatedSQL> COMMIT;Commit completeSQL> 
    SQL> SELECT EXTRACT(XMLVALUE,'/company/NAME/text()').getStringVal()
      2    FROM XMLCONTENT
      3   WHERE XMLID = 1;EXTRACT(XMLVALUE,'/COMPANY/NAM
    --------------------------------------------------------------------------------
    mantisXFSQL> 
      

  6.   

    给你出个注意,我是做java的,我们把xml文件的内容导入oracle中是用Dom组建,先读取xml的内容,然后在写循环把内容导入到oracle中,你看一下行不;