ORACLE DRIVER PARA JAVA
TEngo el siguiente problema : cuando intento hacer un UPDATE de un CLOB a algo que contenga más de 4000 caracteres, el driver de JAVA oracle.sql me corta la query.
Alguien sabe si alguna version nueva de este driver soluciona el problema?
Gracias y saludos a todos los programadores!!!!
Alguien sabe si alguna version nueva de este driver soluciona el problema?
Gracias y saludos a todos los programadores!!!!
Para realizar un Update de más de 4000 caracteres, se debe utilizar variables bind, pero no se como declararlas en el driver de JAVA. Podría alguien aclarar esto???
Aqui tienes un ejemplo de una funcion que inserta en varios campos LOB de un registro de una tabla.
private void insertaLOB (String aTabla, String[] aCamposLOB, String aCampoId, String aValorId, byte[][] dataLOBs, boolean isCLOB) {
Connection cn = null;
Statement st = null;
ResultSet rs = null;
/**
* 1. Validaciones
*/
if (isVacia(aTabla) ||
isVacia (aCamposLOB) ||
isVacia (aCampoId) ||
isVacia (aValorId) ||
isVacia (dataLOBs)) {
return;
}
if (aCamposLOB.length != dataLOBs.length) {
return;
}
try {
cn = getConnection();
if (cn==null) {
return;
}
cn.setAutoCommit (false);
st = cn.createStatement();
// Reseteamos el LOB
String queryReset =
"UPDATE " + aTabla + " SET ";
for (int i = 0; i < aCamposLOB.length; i++) {
if (i > 0)
queryReset += ", ";
queryReset += aCamposLOB[i] + "=empty_" + (isCLOB ? "c" : "b") + "lob()";
}
queryReset += " WHERE " + aCampoId + "=" + aValorId;
st.execute(queryReset);
st.execute("COMMIT");
// Bloqueamos el LOB
String queryForUpdate =
"SELECT ";
for (int i = 0; i < aCamposLOB.length; i++) {
if (i > 0)
queryForUpdate += ", ";
queryForUpdate += aCamposLOB[i];
}
queryForUpdate += " FROM " + aTabla + " WHERE " + aCampoId + "=" + aValorId + " FOR UPDATE";
Log.debug(metodo + " * * * FOR UPDATE: " + queryForUpdate);
rs = st.executeQuery(queryForUpdate);
Clob myClob = null;
Blob myBlob = null;
OutputStream os = null;
// Recuperamos el flujo hacia el LOB
if (rs.next()) {
for (int i = 0; i < dataLOBs.length; i++) {
if (isCLOB) {
// Si estamos ejecutando desde un ejb con weblogic con la maquina virtual de SUN
if (rs instanceof weblogic.jdbc.rmi.SerialResultSet) {
myClob = ((weblogic.jdbc.rmi.SerialResultSet)rs).getClob(i+1);
os = ((weblogic.jdbc.vendor.oracle.OracleThinClob)myClob).getAsciiOutputStream();
}
// Si estamos ejecutando desde un ejb con weblogic con la maquina virtual de BEA, JRockit
else if (rs instanceof weblogic.jdbc.jts.ResultSet) {
myClob = ((weblogic.jdbc.jts.ResultSet)rs).getClob(i+1);
os = ((weblogic.jdbc.vendor.oracle.OracleThinClob)myClob).getAsciiOutputStream();
}
else {
// El resultset es de otro tipo, ver que tipo es con getClass().getName() y hacer un casting a ese tipo.
// El tipo debe venir en el driver jdbc utilizado.
}
}
else {
// Si estamos ejecutando desde un ejb con weblogic con la maquina virtual de SUN
if (rs instanceof weblogic.jdbc.rmi.SerialResultSet) {
myBlob = ((weblogic.jdbc.rmi.SerialResultSet)rs).getBlob(i+1);
os = ((weblogic.jdbc.vendor.oracle.OracleThinBlob)myBlob).getBinaryOutputStream();
}
// Si estamos ejecutando desde un ejb con weblogic con la maquina virtual de BEA, JRockit
else if (rs instanceof weblogic.jdbc.jts.ResultSet) {
myBlob = ((weblogic.jdbc.jts.ResultSet)rs).getBlob(i+1);
os = ((weblogic.jdbc.vendor.oracle.OracleThinBlob)myBlob).getBinaryOutputStream();
}
else {
// El resultset es de otro tipo, ver que tipo es con getClass().getName() y hacer un casting a ese tipo.
// El tipo debe venir en el driver jdbc utilizado.
}
}
// Escribimos el LOB
os.write(dataLOBs[i]);
os.close();
}
} else {
// No se pudo recuperar el " + (isCLOB ? "C" : "B") + "LOB para actualizar
}
rs.close();
st.close();
cn.close();
rs = null;
st = null;
cn = null;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs!=null) try{rs.close();}catch(Exception e){}
if (st!=null) try{st.close();}catch(Exception e){}
if (cn!=null) try{cn.close();}catch(Exception e){}
}
}
private void insertaLOB (String aTabla, String[] aCamposLOB, String aCampoId, String aValorId, byte[][] dataLOBs, boolean isCLOB) {
Connection cn = null;
Statement st = null;
ResultSet rs = null;
/**
* 1. Validaciones
*/
if (isVacia(aTabla) ||
isVacia (aCamposLOB) ||
isVacia (aCampoId) ||
isVacia (aValorId) ||
isVacia (dataLOBs)) {
return;
}
if (aCamposLOB.length != dataLOBs.length) {
return;
}
try {
cn = getConnection();
if (cn==null) {
return;
}
cn.setAutoCommit (false);
st = cn.createStatement();
// Reseteamos el LOB
String queryReset =
"UPDATE " + aTabla + " SET ";
for (int i = 0; i < aCamposLOB.length; i++) {
if (i > 0)
queryReset += ", ";
queryReset += aCamposLOB[i] + "=empty_" + (isCLOB ? "c" : "b") + "lob()";
}
queryReset += " WHERE " + aCampoId + "=" + aValorId;
st.execute(queryReset);
st.execute("COMMIT");
// Bloqueamos el LOB
String queryForUpdate =
"SELECT ";
for (int i = 0; i < aCamposLOB.length; i++) {
if (i > 0)
queryForUpdate += ", ";
queryForUpdate += aCamposLOB[i];
}
queryForUpdate += " FROM " + aTabla + " WHERE " + aCampoId + "=" + aValorId + " FOR UPDATE";
Log.debug(metodo + " * * * FOR UPDATE: " + queryForUpdate);
rs = st.executeQuery(queryForUpdate);
Clob myClob = null;
Blob myBlob = null;
OutputStream os = null;
// Recuperamos el flujo hacia el LOB
if (rs.next()) {
for (int i = 0; i < dataLOBs.length; i++) {
if (isCLOB) {
// Si estamos ejecutando desde un ejb con weblogic con la maquina virtual de SUN
if (rs instanceof weblogic.jdbc.rmi.SerialResultSet) {
myClob = ((weblogic.jdbc.rmi.SerialResultSet)rs).getClob(i+1);
os = ((weblogic.jdbc.vendor.oracle.OracleThinClob)myClob).getAsciiOutputStream();
}
// Si estamos ejecutando desde un ejb con weblogic con la maquina virtual de BEA, JRockit
else if (rs instanceof weblogic.jdbc.jts.ResultSet) {
myClob = ((weblogic.jdbc.jts.ResultSet)rs).getClob(i+1);
os = ((weblogic.jdbc.vendor.oracle.OracleThinClob)myClob).getAsciiOutputStream();
}
else {
// El resultset es de otro tipo, ver que tipo es con getClass().getName() y hacer un casting a ese tipo.
// El tipo debe venir en el driver jdbc utilizado.
}
}
else {
// Si estamos ejecutando desde un ejb con weblogic con la maquina virtual de SUN
if (rs instanceof weblogic.jdbc.rmi.SerialResultSet) {
myBlob = ((weblogic.jdbc.rmi.SerialResultSet)rs).getBlob(i+1);
os = ((weblogic.jdbc.vendor.oracle.OracleThinBlob)myBlob).getBinaryOutputStream();
}
// Si estamos ejecutando desde un ejb con weblogic con la maquina virtual de BEA, JRockit
else if (rs instanceof weblogic.jdbc.jts.ResultSet) {
myBlob = ((weblogic.jdbc.jts.ResultSet)rs).getBlob(i+1);
os = ((weblogic.jdbc.vendor.oracle.OracleThinBlob)myBlob).getBinaryOutputStream();
}
else {
// El resultset es de otro tipo, ver que tipo es con getClass().getName() y hacer un casting a ese tipo.
// El tipo debe venir en el driver jdbc utilizado.
}
}
// Escribimos el LOB
os.write(dataLOBs[i]);
os.close();
}
} else {
// No se pudo recuperar el " + (isCLOB ? "C" : "B") + "LOB para actualizar
}
rs.close();
st.close();
cn.close();
rs = null;
st = null;
cn = null;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs!=null) try{rs.close();}catch(Exception e){}
if (st!=null) try{st.close();}catch(Exception e){}
if (cn!=null) try{cn.close();}catch(Exception e){}
}
}
