为什么我无法正确地将XML字段中的数据提取到此JDBC查询中?

时间:2015-02-16 17:39:44

标签: java xml oracle java-ee jdbc

我在Oracle数据库上执行了以下查询:

SELECT
'ENELSERV' as CODCLIENTE, 
'SL' as SOTTOSISTEMA,
'DD01' as ACCOUNT, 
concat('0',to_char(sysdate,'DDD')) as Progressivo,

substr(xmltype (d.documento).EXTRACT (
      '//cbc:IssueDate/text()') 
      .getStringVal (),1,4) as ANNO,
xmltype (d.documento).EXTRACT (
      '//cac:AccountingCustomerParty/cac:Party/cac:PartyName/cbc:Name/text()')
      .getStringVal () as DESTINATARIO,
concat(concat(
xmltype (d.documento).EXTRACT (
      '//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:StreetName/text()'
      ).getStringVal () 
,' '),xmltype (d.documento).EXTRACT (
      '//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:BuildingNumber/text()'
      ).getStringVal ())        
      AS INDIRIZZO,
xmltype (d.documento).EXTRACT (
      '//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:PostalZone/text()'
      ).getStringVal () as CAP,
xmltype (d.documento).EXTRACT (
      '//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentityCode/text()'
      ).getStringVal () AS PROVINCIA,
xmltype (d.documento).EXTRACT (
      '//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName/text()'
      ).getStringVal () AS COMUNE,

xmltype (d.documento).EXTRACT (
      '//in:Invoice/cbc:ID/text()') 
      .getStringVal () AS ACCTUM,
      pdf
from coda_tx c, documenti_tx d
WHERE   C.FK_TIPO_DOC = 99
        AND C.FK_STATO = 1

        AND C.FK_PIVA_MITTENTE = '05779711000'
        AND C.PK_CODA = D.PFK_CODA
        AND C.CANALE='STA'

正如您所见,此查询选择来自数据库表的字段和来自表示表的特定字段的XML文件中的某些字段。

当我在 Oracle SQL Developer 中执行它时,它运行正常,我正确地将值检索到XML中。

然后我将DAO类(使用JDBC)实现到执行上一个查询的Java代码中,这个:

public void getListaFatturePDF(String partitaIva) {
    System.out.println("INTO ottieniListaFatturePDF()");

    Blob blobFibalPdf;
    String sql;

    StringBuffer sb = new StringBuffer();

    sb.append("SELECT 'ENELSERV' as CODCLIENTE, 'SL' as SOTTOSISTEMA, 'DD01' as ACCOUNT, ");
    sb.append("concat('0',to_char(sysdate,'DDD')) as Progressivo, ");
    sb.append("substr(xmltype (d.documento).EXTRACT ('//cbc:IssueDate/text()').getStringVal (),1,4) as ANNO, ");
    sb.append("xmltype (d.documento).EXTRACT ('//cac:AccountingCustomerParty/cac:Party/cac:PartyName/cbc:Name/text()').getStringVal () as DESTINATARIO, ");
    sb.append("concat(concat(xmltype (d.documento).EXTRACT ('//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:StreetName/text()').getStringVal () ");
    sb.append(",' '),xmltype (d.documento).EXTRACT ('//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:BuildingNumber/text()').getStringVal ()) AS INDIRIZZO, ");
    sb.append("xmltype (d.documento).EXTRACT ('//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:PostalZone/text()').getStringVal () as CAP, ");
    sb.append("xmltype (d.documento).EXTRACT ('//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentityCode/text()').getStringVal () AS PROVINCIA, ");
    sb.append("xmltype (d.documento).EXTRACT ('//cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName/text()').getStringVal () AS COMUNE, ");
    sb.append("xmltype (d.documento).EXTRACT ('//in:Invoice/cbc:ID/text()').getStringVal () AS ACCTUM, ");
    sb.append("pdf ");
    sb.append("from coda_tx c, documenti_tx d ");
    sb.append("WHERE   C.FK_TIPO_DOC = 99 ");
    sb.append("AND C.FK_STATO = 1 ");
    sb.append("AND C.PK_CODA = D.PFK_CODA ");
    sb.append("AND C.CANALE='STA' ");
    sb.append("AND C.FK_PIVA_MITTENTE = '");
    sb.append(partitaIva);
    sb.append("'");

    sql = sb.toString();

    try {
        statment = connection.createStatement();
        ResultSet rs = statment.executeQuery(sql);
        System.out.println("ResultSet obtained");

        //STEP 5: Extract data from result set
        while(rs.next()){
            // Retrieve by column name:

            String codCliente = rs.getString("CODCLIENTE");
            String sottosistema = rs.getString("SOTTOSISTEMA");
            String account = rs.getString("ACCOUNT");
            String progressivo = rs.getString("Progressivo");
            String anno = rs.getString("ANNO");
            String destinatario = rs.getString("DESTINATARIO");
            String indirizzo = rs.getString("INDIRIZZO");
            String cap = rs.getString("CAP");
            String provincia = rs.getString("PROVINCIA");
            String comune = rs.getString("COMUNE");
            String acctum = rs.getString("ACCTUM");
            Blob pdf = rs.getBlob("PDF");

            //int pfk_coda = rs.getInt("PFK_CODA");
            //Blob blobCurrentPdf = rs.getBlob("PDF");


            // Display values:
            System.out.println("codCliente: " + codCliente);
            System.out.println("sottosistema: " + sottosistema);
            System.out.println("account: " + account);
            System.out.println("progressivo: " + progressivo);
            System.out.println("anno: " + anno);
            System.out.println("destinatario: " + destinatario);
            System.out.println("indirizzo: " + indirizzo);
            System.out.println("cap: " + cap);
            System.out.println("provincia: " + provincia);
            System.out.println("comune: " + comune);
            System.out.println("acctum: " + acctum);

            System.out.println("----------------------------------------------------------------------------------");


            //System.out.println("PFK_CODA: " + pfk_coda);

        }

    } catch (SQLException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }

}

问题是我对标准数据库单元格的值没有问题(字段: CODCLIENTE SOTTOSISTEMA ACCOUNT )但是对于从XML检索到的所有其他字段,我有一个空字符串作为值。

为什么呢?我错过了什么?我该如何解决这个问题?

TNX

0 个答案:

没有答案