Я работаю над кодом, который сканирует таблицу БД на наличие имен столбцов, а затем строит инструкцию SQL для создания таблицы на основе подмножества столбцов.Конечный оператор может быть довольно большим (в некоторых случаях 60 столбцов).
Вот небольшой фрагмент:
case ["VARCHAR", "CHAR"]:
clause = "${row.name} ${row.colType.trim()}(${row.length})"
break
Мой вопрос: когда мне следует форсировать GString?В настоящее время я жду, пока не построю весь оператор, а затем вызываю .toString()
в самом конце.Будет ли какая-то разница, если я вместо этого позвоню .toString()
на этом уровне?
Еще код:
//CONTEXT
def rs = inputs.connection.sqlConnection.eachRow(tableNamesSql){ row ->
clause = buildSqlClause(row)
columnNames.append(clause).append(',\n')
}
def formatted = columnNames.toString().replaceAll(",\$", "")
def sql = """CREATE TABLE ${inputs.outputSchemaName}.${inputs.outputTableName}_${inputs.cycle} (
${formatted}
) IN TBTS_${inputs.outputSchemaName}"""
И код, который анализирует строку:
def buildSqlClause(row){
def clause
switch(row.colType.trim()){
case "INTEGER":
clause = "${row.name} ${row.colType.trim()}"
break
case "DECIMAL":
clause = "${row.name} ${row.colType.trim()}(${row.length}, ${row.scale})"
break
case ["VARCHAR", "CHAR"]:
clause = "${row.name} ${row.colType.trim()}(${row.length})"
break
case "TIMESTMP":
clause = "${row.name} TIMESTAMP"
break
case "DATE":
clause = "${row.name} ${row.colType.trim()}"
break
default: throw new Exception("Invalid SQL data type: [${row.colType}]")
}
def nullVal = row.nulls
if(nullVal.equalsIgnoreCase("N")){
clause = "${clause} NOT NULL"
}
return clause
}
То есть, другими словами, в случае столбца БД "foo"Мне нужно предложение sql, чтобы прочитать FOO VARCHAR(INT)
.