in empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java [292:372]
protected void addUpdateWithJoins(DBSQLBuilder sql, DBRowSet table)
{
// The update table
DBColumn[] keyColumns = table.getKeyColumns();
if (keyColumns==null || keyColumns.length==0)
throw new NoPrimaryKeyException(table);
// Generate Merge expression
sql.reset(0);
sql.append("MERGE INTO ");
table.addSQL(sql, CTX_FULLNAME|CTX_ALIAS);
// Using
sql.append("\r\nUSING (");
// Add set expressions
List<DBColumnExpr> using = new ArrayList<DBColumnExpr>();
// Add key columns
for (DBColumn col : keyColumns)
using.add(col);
// Select Set-Expressions
List<DBSetExpr> mergeSet = new ArrayList<DBSetExpr>(set.size());
for (DBSetExpr sex : set)
{ // Select set expressions
Object val = sex.getValue();
if (val instanceof DBColumnExpr)
{
DBColumnExpr expr = ((DBColumnExpr)val);
if (!(expr instanceof DBColumn) && !(expr instanceof DBAliasExpr))
{ // rename column
String name = "COL_"+String.valueOf(mergeSet.size());
expr = expr.as(name);
}
// select
using.add(expr);
// Name
DBValueExpr NAME_EXPR = getDatabase().getValueExpr("q0."+expr.getName(), DataType.UNKNOWN);
mergeSet.add(sex.getColumn().to(NAME_EXPR));
}
else
{ // add original
mergeSet.add(sex);
}
// remove column from using list (if present)
DBColumn setColum = sex.getColumn();
if (using.contains(setColum))
using.remove(setColum);
}
// Add select
sql.append("SELECT ");
// Add optimizer hint
if (StringUtils.isNotEmpty(optimizerHint))
sql.append("/*+ ").append(optimizerHint).append(" */ ");
// Add select columns
addListExpr(sql, using, CTX_ALL, ", ");
// From clause
addFrom(sql);
// Add Where
addWhere(sql);
// Add Grouping
addGrouping(sql);
// on
int count = 0;
sql.append(") q0\r\nON (");
for (DBColumn col : keyColumns)
{ // skip set columns
if (using.contains(col)==false)
continue;
// add separator
if (count++>0)
sql.append(" AND ");
// add constraint
sql.append(" q0.");
col.addSQL(sql, CTX_NAME);
sql.append("=");
sql.append(table.getAlias());
sql.append(".");
col.addSQL(sql, CTX_NAME);
}
// Set Expressions
sql.append(")\r\nWHEN MATCHED THEN UPDATE ");
sql.append("\r\nSET ");
addListExpr(sql, mergeSet, CTX_DEFAULT, ", ");
}