我很想尝试使用 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
答案 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