简体   繁体   English

从Java中的XML检索数据并在Oracle中插入数据

[英]Retrive data from XML in Java and insert data in Oracle

I have used JAXB Unmarshaler in Java to retrive data from XML into Java objects which is working fine. 我已经在Java中使用JAXB Unmarshaler来将数据从XML检索到Java对象中,这工作正常。

Below is my code: 下面是我的代码:

import java.io.File;
import java.io.FileNotFoundException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;    

public class FRDDbImportWorkflow {


     public static void main(String...args) throws FileNotFoundException {

          File xmlFile = new File("//home/tr.xml");       

          try {             

              JAXBContext jaxbContext  = JAXBContext.newInstance(FRD115Type.class);

              Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

              JAXBElement<FRD115Type> jaxbElement = (JAXBElement<Fd115Type>) jaxbUnmarshaller
                        .unmarshal(new StreamSource(xmlFile), Fd115Type.class);

              FRD115Type obj = jaxbElement.getValue();

              System.out.println(obj.getRptHdr().getEnvText()); 
           } catch (JAXBException e) {
               e.printStackTrace();
       }

    }

}

Now i want to create another java class which will insert this data into Oracle table. 现在,我想创建另一个Java类,它将将此数据插入Oracle表。 As i have many xml element in xml file then do i need to create get method for all this element to retrive the data from xml and then insert into Oracle ? 由于我在xml文件中有许多xml元素,那么是否需要为所有此元素创建get method以从xml中检索数据,然后插入Oracle中?

Is there any other parser technique used instead of creating get method for all this xml element ? 有没有使用其他解析器技术来代替为所有此xml元素创建get method

I am also not sure how to insert this xml data into Oracle. 我也不确定如何将此xml数据插入Oracle。 I have created below table in Oracle : 我在Oracle中创建了下表:

CREATE TABLE
    IMPORT_XML
    (
        fd115 VARCHAR2(180),
        RPTHDR VARCHAR2(180),
        EXCHNAM VARCHAR2(50),
        ENVTEXT VARCHAR2(20),
        RPTCOD VARCHAR2(20),
        RPTNAM VARCHAR2(180),
        RPTFLEXKEY VARCHAR2(180),
        MEMBID VARCHAR2(50),
        MEMBLGLNAM VARCHAR2(80),
        RPTPRNTEFFDAT DATE,
        RPTPRNTEFFTIM VARCHAR2(50),
        RPTPRNTRUNDAT DATE,
        fd115GRP VARCHAR2(180),
        fd115KEYGRP VARCHAR2(180),
        PARTICIPANTGRP VARCHAR2(180),
        PARTICIPANT VARCHAR2(50),
        PARTLNGNAME VARCHAR2(50),
        fd115GRP1 VARCHAR2(180),
        fd115KEYGRP1 VARCHAR2(180),
        BUSINESSUNITGRP VARCHAR2(180),
        BUSINESSUNIT VARCHAR2(180),
        BUSUNTLNGNAME VARCHAR2(50),
        BUSINESSUNITID NUMBER(30,9),
        fd115GRP2 VARCHAR2(180),
        fd115KEYGRP2 VARCHAR2(180),
        USER_NAME VARCHAR2(50),
        USERNUMERICID NUMBER(30,9),
        fd115REC1 VARCHAR2(180),
        USRGROUP VARCHAR2(50),
        USER_LEVEL VARCHAR2(10),
        LOGNAM VARCHAR2(50),
        ISUSFLG NUMBER(30,9),
        EFFSTATUS NUMBER(30,9),
        DELPROTECTED VARCHAR2(10),
        ENABLEPROPRIETARYACCT VARCHAR2(10),
        ENABLEAGENCYACCT VARCHAR2(10),
        ENABLEMARKETMAKINGACCT VARCHAR2(10),
        ENABLEBESTACCT VARCHAR2(10),
        ENABLERISKLESSPRINCIPALACCT VARCHAR2(10),
        MAXORDERVALUE VARCHAR2(100),
        MAXORDRQTY VARCHAR2(100),
        SETTLACCT NUMBER(30,9),
        SETTLLOCAT VARCHAR2(50),
        fd115GRP3 VARCHAR2(180),
        fd115KEYGRP3 VARCHAR2(180),
        MKTGRPNAM VARCHAR2(50),
        fd115REC2 VARCHAR2(180),
        ENTROLE VARCHAR2(50),
        fd115GRP4 VARCHAR2(180),
        TESTYPE NUMBER(30,9),
        TESELIGIBILITY NUMBER(30,9)
    );

Use XMLTABLE . 使用XMLTABLE Something like: 就像是:

INSERT INTO import_xml (
  EXCHNAM,
  ENVTEXT,
  RPTCOD,
  RPTNAM,
  RPTFLEXKEY,
  MEMBID,
  MEMBLGLNAM,
  RPTPRNTEFFDAT,
  RPTPRNTRUNDAT,
  PARTICIPANT
)
SELECT EXCHNAM,
       ENVTEXT,
       RPTCOD,
       RPTNAM,
       RPTFLEXKEY,
       MEMBID,
       MEMBLGLNAM,
       RPTPRNTEFFDAT + ( TO_TIMESTAMP( RPTPRNTEFFTIM, 'HH24:MI:SS.FF2' )
                       - TO_TIMESTAMP( '00:00:00.00', 'HH24:MI:SS.FF2' ) ),
       RPTPRNTRUNDAT,
       PARTICIPANT
FROM   XMLTABLE(
         XMLNAMESPACES( DEFAULT 'http://www.eu.com/technology' ),
         '//fd115'
         PASSING XMLType( your_xml )
         COLUMNS
           EXCHNAM        VARCHAR2(50)  PATH './rptHdr/exchNam',
           ENVTEXT        VARCHAR2(20)  PATH './rptHdr/envText',
           RPTCOD         VARCHAR2(20)  PATH './rptHdr/rptCod',
           RPTNAM         VARCHAR2(180) PATH './rptHdr/rptNam',
           RPTFLEXKEY     VARCHAR2(180) PATH './rptHdr/rptFlexKey',
           MEMBID         VARCHAR2(50)  PATH './rptHdr/membId',
           MEMBLGLNAM     VARCHAR2(80)  PATH './rptHdr/membLglNam',
           RPTPRNTEFFDAT  TIMESTAMP     PATH './rptHdr/rptPrntEffDat',
           RPTPRNTEFFTIM  VARCHAR2(50)  PATH './rptHdr/rptPrntEffTim',
           RPTPRNTRUNDAT  DATE          PATH './rptHdr/rptPrntRunDat',
           PARTICIPANT    VARCHAR2(50)  PATH './fd115Grp/fd115KeyGrp/participantGrp/participant'
       );

db<>fiddle db <>小提琴

(You'll need to check the XQuery paths and add in all the extra columns but this should give you an example of the syntax you can use.) (您需要检查XQuery路径并添加所有额外的列,但这应该为您提供可以使用的语法的示例。)

Also, RPTPRNTEFFDAT can have the TIMESTAMP data type and store both the RPTPRNTEFFDAT and RPTPRNTEFFTIM xml data. 同样, RPTPRNTEFFDAT可以具有TIMESTAMP数据类型,并存储RPTPRNTEFFDATRPTPRNTEFFTIM xml数据。 (You could use a DATE column but the RPTPRNTEFFTIM data appears to have fractional seconds and you would lose that precision.) (您可以使用DATE列,但是RPTPRNTEFFTIM数据似乎只有几分之一秒,您将失去该精度。)

CREATE TABLE
    IMPORT_XML
    (
        fd115 VARCHAR2(180),
        RPTHDR VARCHAR2(180),
        EXCHNAM VARCHAR2(50),
        ENVTEXT VARCHAR2(20),
        RPTCOD VARCHAR2(20),
        RPTNAM VARCHAR2(180),
        RPTFLEXKEY VARCHAR2(180),
        MEMBID VARCHAR2(50),
        MEMBLGLNAM VARCHAR2(80),
        RPTPRNTEFFDAT TIMESTAMP, -- TIMESTAMP and remove the RPTPRNTEFFTIM column
        RPTPRNTRUNDAT DATE,
        fd115GRP VARCHAR2(180),
        fd115KEYGRP VARCHAR2(180),
        PARTICIPANTGRP VARCHAR2(180),
        PARTICIPANT VARCHAR2(50),
   ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM