Skip to content

Commit

Permalink
0004202: Handle 39 and 40 digit numbers on Oracle
Browse files Browse the repository at this point in the history
  • Loading branch information
erilong committed Dec 18, 2019
1 parent f0725bd commit d120377
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
Expand Up @@ -36,7 +36,7 @@ public OracleTriggerTemplate(ISymmetricDialect symmetricDialect) {
emptyColumnTemplate = "''" ;
stringColumnTemplate = "decode($(tableAlias).\"$(columnName)\", null, $(oracleToClob)'', '\"'||replace(replace($(oracleToClob)$(tableAlias).\"$(columnName)\",'\\','\\\\'),'\"','\\\"')||'\"')" ;
geometryColumnTemplate = "case when $(tableAlias).\"$(columnName)\" is null then to_clob('') else '\"'||replace(replace(SDO_UTIL.TO_WKTGEOMETRY($(tableAlias).\"$(columnName)\"),'\\','\\\\'),'\"','\\\"')||'\"' end";
numberColumnTemplate = "decode($(tableAlias).\"$(columnName)\", null, '', '\"'||cast($(tableAlias).\"$(columnName)\" as number("+symmetricDialect.getTemplateNumberPrecisionSpec()+"))||'\"')" ;
numberColumnTemplate = "decode($(tableAlias).\"$(columnName)\", null, '', '\"'||" + getNumberConversionString() + "||'\"')" ;
datetimeColumnTemplate = "decode($(tableAlias).\"$(columnName)\", null, '', concat(concat('\"',to_char($(tableAlias).\"$(columnName)\", 'YYYY-MM-DD HH24:MI:SS.FF9')),'\"'))" ;
dateTimeWithTimeZoneColumnTemplate = "decode($(tableAlias).\"$(columnName)\", null, '', concat(concat('\"',to_char($(tableAlias).\"$(columnName)\", 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM')),'\"'))" ;
dateTimeWithLocalTimeZoneColumnTemplate = "decode($(tableAlias).\"$(columnName)\", null, '', concat(concat('\"',to_char(cast($(tableAlias).\"$(columnName)\" as timestamp), 'YYYY-MM-DD HH24:MI:SS.FF9')),'\"'))" ;
Expand Down Expand Up @@ -259,6 +259,13 @@ public OracleTriggerTemplate(ISymmetricDialect symmetricDialect) {
"select $(oracleQueryHint) $(oracleToClob)$(columns) from $(schemaName)$(tableName) t where $(whereClause)");
}

protected String getNumberConversionString() {
if (symmetricDialect.getParameterService().is(ParameterConstants.DBDIALECT_ORACLE_TEMPLATE_NUMBER_TEXT_MINIMUM)) {
return "to_char($(tableAlias).\"$(columnName)\", 'TM')";
} else {
return "cast($(tableAlias).\"$(columnName)\" as number(" + symmetricDialect.getTemplateNumberPrecisionSpec() + "))";
}
}
protected String getCreateTimeExpression(ISymmetricDialect symmetricDialect) {
String timezone = symmetricDialect.getParameterService().getString(ParameterConstants.DATA_CREATE_TIME_TIMEZONE);
if (StringUtils.isEmpty(timezone)) {
Expand Down
Expand Up @@ -246,6 +246,7 @@ private ParameterConstants() {

public final static String DBDIALECT_ORACLE_USE_TRANSACTION_VIEW = "oracle.use.transaction.view";
public final static String DBDIALECT_ORACLE_TEMPLATE_NUMBER_SPEC = "oracle.template.precision";
public final static String DBDIALECT_ORACLE_TEMPLATE_NUMBER_TEXT_MINIMUM = "oracle.template.precision.text.minimum";
public final static String DBDIALECT_ORACLE_USE_HINTS = "oracle.use.hints";
public final static String DBDIALECT_ORACLE_USE_SELECT_START_DATA_ID_HINT = "oracle.use.select.data.using.start.data.id.hint";
public final static String DBDIALECT_ORACLE_SEQUENCE_NOORDER = "oracle.sequence.noorder";
Expand Down
11 changes: 11 additions & 0 deletions symmetric-core/src/main/resources/symmetric-default.properties
Expand Up @@ -1747,6 +1747,17 @@ hsqldb.initialize.db=true
# Tags: other
oracle.template.precision=*,38

# Use the text minimum format model for capturing changes to number data types.
# When enabled, numbers are converted with to_char('TM'), which can
# capture up to 40 digits.
# When disabled, numbers are converted with cast to number(*,38), which
# can capture up to 38 digits.
#
# DatabaseOverridable: false
# Tags: other
# Type: boolean
oracle.template.precision.text.minimum=false

# Requires access to gv$transaction
# Tags: other
# Type: boolean
Expand Down

0 comments on commit d120377

Please sign in to comment.