package com.taobao.yugong.common.db.sql;
/**
* http://en.wikipedia.org/wiki/Merge_(SQL)
*
* @author agapple 2014年2月25日 下午11:38:06
* @since 1.0.0
*/
public class OracleSqlTemplate extends SqlTemplate {
public String getMergeSql(String schemaName, String tableName, String[] pkNames, String[] colNames) {
final String aliasA = "a";
final String aliasB = "b";
String[] allColumns = buildAllColumns(pkNames, colNames);
StringBuilder sql = new StringBuilder();
sql.append("merge /*+ use_nl(a b)*/ into ");
sql.append(makeFullName(schemaName, tableName)).append(" ").append(aliasA);
sql.append(" using (select ");
int size = allColumns.length;
// 构建 (select ? as col1, ? as col2 from dual)
for (int i = 0; i < size; i++) {
sql.append("? as " + allColumns[i]).append(splitCommea(size, i));
}
sql.append(" from dual) ").append(aliasB);
sql.append(" on (");
size = pkNames.length;
for (int i = 0; i < size; i++) {
sql.append(concat(pkNames[i], aliasA)).append("=").append(concat(pkNames[i], aliasB));
sql.append((i + 1 < size) ? " and " : "");
}
sql.append(") when matched then update set ");
size = colNames.length;
for (int i = 0; i < size; i++) {
sql.append(concat(colNames[i], aliasA)).append("=").append(concat(colNames[i], aliasB));
sql.append(splitCommea(size, i));
}
sql.append(" when not matched then insert (");
size = allColumns.length;
for (int i = 0; i < size; i++) {
sql.append(concat(allColumns[i], aliasA)).append(splitCommea(size, i));
}
sql.append(" ) values (");
size = allColumns.length;
for (int i = 0; i < size; i++) {
sql.append(concat(allColumns[i], aliasB)).append(splitCommea(size, i));
}
sql.append(" )");
// intern优化,避免出现大量相同的字符串
return sql.toString().intern();
}
private String concat(String column, final String aliasA) {
return aliasA + "." + column;
}
}