我何时应该在Gstring上强制插值?

时间:2011-10-25 14:16:14

标签: groovy string-interpolation

我正在研究将在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)

1 个答案:

答案 0 :(得分:1)

你需要调用toString()吗?

此外,您可能会获得更好的结果collect List字段定义字符串(正如您所做),然后调用join将它们拼接在一起?