我正在研究将在db表中扫描列名的代码,然后根据列的子集构建一个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
}
换句话说,在db列“foo”的情况下,我需要读取sql子句
FOO VARCHAR(INT)
。
答案 0 :(得分:1)
你需要调用toString()吗?
此外,您可能会获得更好的结果collect
List
字段定义字符串(正如您所做),然后调用join
将它们拼接在一起?