我正在编写将扫描 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)
。