Java 为什么我能';是否使用XMLType从CLOB XML中提取此值到JDBC查询中?

Java 为什么我能';是否使用XMLType从CLOB XML中提取此值到JDBC查询中?,java,oracle,jakarta-ee,jdbc,clob,Java,Oracle,Jakarta 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()

试图使用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.
    }
问题是,当执行前一种方法时,我获得了CODCLIENTESottosItemaACCOUNT字段的正确有效值,但ANNO字段值是空字符串,实际上这是我在控制台中获得的值(println结果):

如果直接在Oracle SQL Developer中执行上一个查询,为什么它工作得很好?但是当我尝试将它用于JDBC DAO方法时,会遇到这个问题

可能与角色有关,必须转义到:

sb.append("substr(xmltype(d.documento).EXTRACT('//cbc:IssueDate/text()').getStringVal (),1,4) as ANNO ");
我错过了什么?如何解决此问题


Tnx

由我自己解决。我使用oraclesqldeveloper安装目录中的ojdbc.jar文件将JDBC驱动程序更改为我的项目(我认为这是一个较旧的版本,但它仍然有效)

这是不工作驱动器版本的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

是否需要
xmltype
?如果不是,则可以得到整个XML:
rs.getClob(“documento”).getAsciStream()
然后可以使用xpath获取
IssueDate
。我知道这不是你想要的,但它可以工作。你能告诉我你使用的是哪个版本(失败的版本)和你现在使用的是哪个版本(有效的版本)?这两个文件都名为ojdbc.jar(但具有不同的强度)。我怎么知道这个版本?查看它的
META-INF/MANIFEST.MF
。必须是名为
实施版本
规范版本
的条目,或者,可能,both@Albert编辑了我的答案,包括2个ojdbc.jar文件的MANIFEST.MF。你能对我说些什么?怎么可能是最老的能正常工作而最新的不能工作呢?一点也不知道。我也不明白。两个版本似乎都是4.0。据我所知,ojdbc4.jar版本是针对DBOracle10.x.x.x的,使用Java1.4和1.5。至少,你能让它工作。
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