1

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

4

1 回答 1

1

你需要调用 toString() 吗?

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

于 2011-10-25T14:27:42.750 回答