为什么我无法使用XMLType将此值从CLOB XML提取到JDBC查询中?

时间:2015-02-17 09:13:01

标签: java oracle java-ee jdbc clob

我很想尝试使用 xmltype 从Oracle DB表的 CLOB 字段中提取XML字段值。

所以我有以下问题:

SELECT
  'ENELSERV'    AS codcliente,
  'SL'          AS sottosistema,
  'DD01'        AS account,
  substr(xmltype(d.documento)
           .EXTRACT('//cbc:IssueDate/text()').getStringVal()
        , 1, 4) AS anno
 FROM coda_tx c,
      documenti_tx d
WHERE c.fk_tipo_doc = 99
  AND c.fk_stato = 1
  AND c.pk_coda = d.pfk_coda
  AND c.canale = 'STA'
  AND c.fk_piva_mittente = '05779711000'

如果我在 Oracle SQL Developer 中执行此查询,我会获得所需的结果,此表包含以下两行:

CODCLIENTE  SOTTOSISTEMA  ACCOUNT  ANNO
----------------------------------------
MYCLIENT    SL            DD01     2014
MYCLIENT    SL            DD01     2014

因此查询工作正常,我获得了预期的结果。

现在我必须将之前的查询放入JDBC DAO类中,并且我这样做了:

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("substr(xmltype(d.documento).EXTRACT('//cbc:IssueDate/text()').getStringVal (),1,4) as ANNO ");
    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 = '05779711000'");

    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 anno = rs.getString("ANNO");

            // Display values:
            System.out.println("codCliente: " + codCliente);
            System.out.println("sottosistema: " + sottosistema);
            System.out.println("account: " + account);
            System.out.println("anno: " + anno);
        }

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

问题在于,当执行上一个方法时,我获得 CODCLIENTE SOTTOSISTEMA ACCOUNT 字段的正确值,但< strong> ANNO 字段值是一个空字符串,实际上这是我在控制台中获得的(println结果):

INTO ottieniListaFatturePDF()
ResultSet obtained
codCliente: ENELSERV
sottosistema: SL
account: DD01
anno: 

如果先前的查询直接执行到 Oracle SQL Developer ,为什么以前的查询工作正常但是当我尝试将它用于我的JDBC DAO方法时遇到此问题?

可能是与角色有关的东西必须被转义:

sb.append("substr(xmltype(d.documento).EXTRACT('//cbc:IssueDate/text()').getStringVal (),1,4) as ANNO ");

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

TNX

1 个答案:

答案 0 :(得分:1)

由我自己解决。我使用 ojdbc.jar 文件将JDBC驱动程序更改为我的项目,该文件位于 Oracle SQL Developer 安装目录中(我认为这是旧版本,但它更糟糕)。

这是不工作驱动版本的 MANIFEST.MF

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 20.75-b01 (Sun Microsystems Inc.)
Implementation-Vendor: Oracle Corporation
Implementation-Title: JDBC
Implementation-Version: 12.1.0.2.0
Repository-Id: JAVAVM_12.1.0.2.0_LINUX.X64_140630
Specification-Vendor: Sun Microsystems Inc.
Specification-Title: JDBC
Specification-Version: 4.0
Main-Class: oracle.jdbc.OracleDriver
sealed: true

Name: oracle/sql/converter/
Sealed: false

Name: oracle/sql/
Sealed: false

Name: oracle/sql/converter_xcharset/
Sealed: false

这是工作人员的 MANIFEST.MF

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.5.0_24-rev-b08 (Sun Microsystems Inc.)
Implementation-Vendor: Oracle Corporation
Implementation-Title: JDBC
Implementation-Version: 11.2.0.2.0
Repository-Id: JAVAVM_11.2.0.2.0_LINUX_100812.1
Specification-Vendor: Sun Microsystems Inc.
Specification-Title: JDBC
Specification-Version: 4.0
Main-Class: oracle.jdbc.OracleDriver
sealed: true

Name: oracle/sql/converter/
Sealed: false

Name: oracle/sql/
Sealed: false

Name: oracle/sql/converter_xcharset/
Sealed: false