Java 为什么我能';是否使用XMLType从CLOB XML中提取此值到JDBC查询中?
试图使用xmltype从Oracle DB表的CLOB字段中提取XML字段值,我简直疯了 因此,我有以下疑问: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()
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、SottosItema、ACCOUNT字段的正确有效值,但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