diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/oracle/OracleTriggerTemplate.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/oracle/OracleTriggerTemplate.java index 514d848151..489e9b58b4 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/oracle/OracleTriggerTemplate.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/oracle/OracleTriggerTemplate.java @@ -45,6 +45,7 @@ public OracleTriggerTemplate(ISymmetricDialect symmetricDialect) { clobColumnTemplate = "decode(dbms_lob.getlength(to_clob($(tableAlias).\"$(columnName)\")), null, to_clob(''), '\"'||replace(replace($(tableAlias).\"$(columnName)\",'\\','\\\\'),'\"','\\\"')||'\"')" ; blobColumnTemplate = "decode(dbms_lob.getlength($(tableAlias).\"$(columnName)\"), null, to_clob(''), '\"'||$(prefixName)_blob2clob($(tableAlias).\"$(columnName)\")||'\"')" ; booleanColumnTemplate = "decode($(tableAlias).\"$(columnName)\", null, '', '\"'||cast($(tableAlias).\"$(columnName)\" as number("+symmetricDialect.getTemplateNumberPrecisionSpec()+"))||'\"')" ; + xmlColumnTemplate = "decode(dbms_lob.getlength($(tableAlias).\"$(columnName)\".getclobval()), null, to_clob(''), '\"'||replace(replace($(tableAlias).\"$(columnName)\".getclobval(),'\\','\\\\'),'\"','\\\"')||'\"')" ; triggerConcatCharacter = "||" ; newTriggerValue = ":new" ; oldTriggerValue = ":old" ; @@ -100,8 +101,8 @@ public OracleTriggerTemplate(ISymmetricDialect symmetricDialect) { " end if; \n" + " $(custom_on_insert_text) \n" + " end; \n"); - - + + sqlTemplates.put("updateTriggerTemplate" , "create or replace trigger $(triggerName) after update on $(schemaName)$(tableName) \n" + " for each row begin \n" + @@ -165,7 +166,7 @@ public OracleTriggerTemplate(ISymmetricDialect symmetricDialect) { " end; \n" + " $(custom_on_update_text) \n" + " end; \n" ); - + sqlTemplates.put("deleteTriggerTemplate" , "create or replace trigger $(triggerName) after delete on $(schemaName)$(tableName) \n" + " for each row begin \n" + @@ -183,7 +184,7 @@ public OracleTriggerTemplate(ISymmetricDialect symmetricDialect) { " $(txIdExpression), \n" + " $(prefixName)_pkg.disable_node_id, \n" + " $(externalSelect), \n" + -" " + getCreateTimeExpression(symmetricDialect) + " \n" + +" " + getCreateTimeExpression(symmetricDialect) + " \n" + " ); \n" + " end if; \n" + " $(custom_on_delete_text) \n" + @@ -192,14 +193,14 @@ public OracleTriggerTemplate(ISymmetricDialect symmetricDialect) { sqlTemplates.put("initialLoadSqlTemplate" , "select $(oracleToClob)$(columns) from $(schemaName)$(tableName) t where $(whereClause) " ); } - + protected String getCreateTimeExpression(ISymmetricDialect symmetricDialect) { String timezone = symmetricDialect.getParameterService().getString(ParameterConstants.DATA_CREATE_TIME_TIMEZONE); if (StringUtils.isEmpty(timezone)) { return "CURRENT_TIMESTAMP"; } else { return String.format("CURRENT_TIMESTAMP AT TIME ZONE '%s'", timezone); - } + } } -} \ No newline at end of file +} diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDmlStatement.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDmlStatement.java index c3d8b6d19a..2a28b78ab7 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDmlStatement.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDmlStatement.java @@ -43,6 +43,8 @@ protected void appendColumnParameter(StringBuilder sql, Column column) { .append(","); } else if (isGeometry(column)) { sql.append("SYM_WKT2GEOM(?)").append(","); + } else if (column.getJdbcTypeName().startsWith("XMLTYPE")) { + sql.append("XMLTYPE(?)").append(","); } else { super.appendColumnParameter(sql, column); } @@ -56,6 +58,9 @@ protected void appendColumnEquals(StringBuilder sql, Column column) { } else if (isGeometry(column)) { sql.append(quote).append(column.getName()).append(quote).append(" = ") .append("SYM_WKT2GEOM(?)"); + } else if (column.getJdbcTypeName().startsWith("XMLTYPE")) { + sql.append(quote).append(column.getName()).append(quote).append(" = ") + .append("XMLTYPE(?)"); } else { super.appendColumnEquals(sql, column); } @@ -64,10 +69,9 @@ protected void appendColumnEquals(StringBuilder sql, Column column) { @Override protected int getTypeCode(Column column, boolean isDateOverrideToTimestamp) { int typeCode = super.getTypeCode(column, isDateOverrideToTimestamp); - if (column.getJdbcTypeName().startsWith("XML")) { - typeCode = Types.VARCHAR; - } else if (typeCode == Types.LONGVARCHAR - || isGeometry(column)) { + if (typeCode == Types.LONGVARCHAR + || isGeometry(column) + || column.getJdbcTypeName().startsWith("XMLTYPE")) { typeCode = Types.CLOB; } return typeCode; diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlReader.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlReader.java index 273f59a568..311e62fb36 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlReader.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlReader.java @@ -142,7 +142,7 @@ protected Integer mapUnknownJdbcTypeForColumn(Map values) { } else if (typeName != null && typeName.startsWith("NCHAR")) { return Types.CHAR; } else if (typeName != null && typeName.startsWith("XML")) { - return Types.LONGVARCHAR; + return Types.SQLXML; } else if (typeName != null && typeName.endsWith("CLOB")) { return Types.LONGVARCHAR; } else if (typeName != null && typeName.startsWith("BINARY_FLOAT")) { diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/sql/JdbcSqlTemplate.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/sql/JdbcSqlTemplate.java index cce10761fa..5d20f2bd6f 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/sql/JdbcSqlTemplate.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/sql/JdbcSqlTemplate.java @@ -352,7 +352,12 @@ public Integer execute(Connection con) throws SQLException { long endTime = System.currentTimeMillis(); logSqlBuilder.logSql(log, sql, args, types, (endTime-startTime)); - return stmt.getUpdateCount(); + int updateCount; + do{ + updateCount = stmt.getUpdateCount(); + }while(stmt.getMoreResults() || stmt.getUpdateCount() != -1); + + return updateCount; } catch (SQLException e) { throw logSqlBuilder.logSqlAfterException(log, sql, args, e); } finally { @@ -375,7 +380,12 @@ public Integer execute(Connection con) throws SQLException { long endTime = System.currentTimeMillis(); logSqlBuilder.logSql(log, sql, args, types, (endTime-startTime)); - return ps.getUpdateCount(); + int updateCount; + do{ + updateCount = ps.getUpdateCount(); + }while(ps.getMoreResults() || ps.getUpdateCount() != -1); + + return updateCount; } catch (SQLException e) { throw logSqlBuilder.logSqlAfterException(log, sql, args, e); } finally {