Когда я должен форсировать Gstring? - PullRequest
1 голос
/ 25 октября 2011

Я работаю над кодом, который сканирует таблицу БД на наличие имен столбцов, а затем строит инструкцию 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).

1 Ответ

1 голос
/ 25 октября 2011

Вам нужно вообще вызывать toString ()?

Кроме того, вы могли бы получить лучшие результаты collect, используя List строки определения поля (как вы делаете), а затем вызвать join, чтобы соединить их все вместе?

...