docs: public String getMergeSql(String schemaName, String tableName, String[] keyNames, String[] columnNames,
                                String[] viewColumnNames, boolean includePks, String shardColumn) {
          final String aliasA = "a";
          final String aliasB = "b";
          StringBuilder sql = new StringBuilder();
  
          sql.append("merge /*+ use_nl(a b)*/ into ")
              .append(getFullName(schemaName, tableName))
              .append(" ")
              .append(aliasA);
          sql.append(" using (select ");
  
          int size = columnNames.length;
          // 构建 (select ? as col1, ? as col2 from dual)
          for (int i = 0; i < size; i++) {
              sql.append("? as " + appendEscape(columnNames[i])).append(" , ");
          }
          size = keyNames.length;
          for (int i = 0; i < size; i++) {
              sql.append("? as " + appendEscape(keyNames[i])).append((i + 1 < size) ? " , " : "");
          }
          sql.append(" from dual) ").append(aliasB);
          sql.append(" on (");
  
          size = keyNames.length;
          for (int i = 0; i < size; i++) {
              sql.append(aliasA + "." + appendEscape(keyNames[i]))
                  .append("=")
                  .append(aliasB + "." + appendEscape(keyNames[i]));
              sql.append((i + 1 < size) ? " and " : "");
          }
  
          sql.append(") when matched then update set ");
  
          size = columnNames.length;
          for (int i = 0; i < size; i++) {
              sql.append(aliasA + "." + appendEscape(columnNames[i]))
                  .append("=")
                  .append(aliasB + "." + appendEscape(columnNames[i]));
              sql.append((i + 1 < size) ? " , " : "");
          }
  
          sql.append(" when not matched then insert (");
          size = columnNames.length;
          for (int i = 0; i < size; i++) {
              sql.append(aliasA + "." + appendEscape(columnNames[i])).append(" , ");
          }
          size = keyNames.length;
          for (int i = 0; i < size; i++) {
              sql.append(aliasA + "." + appendEscape(keyNames[i])).append((i + 1 < size) ? " , " : "");
          }
  
          sql.append(" ) values (");
          size = columnNames.length;
          for (int i = 0; i < size; i++) {
              sql.append(aliasB + "." + appendEscape(columnNames[i])).append(" , ");
          }
          size = keyNames.length;
          for (int i = 0; i < size; i++) {
              sql.append(aliasB + "." + appendEscape(keyNames[i])).append((i + 1 < size) ? " , " : "");
          }
          sql.append(" )");
          return sql.toString().intern(); // intern优化，避免出现大量相同的字符串
      }