1

私は、dbテーブルで列名をスキャンし、SQLステートメントを作成して、列のサブセットに基づいてテーブルを作成するコードに取り組んでいます。endステートメントは非常に大きくなる可能性があります(場合によっては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すると、より良い結果が得られる可能性があります。次に、それらをすべてつなぎ合わせるために呼び出しますか?Listjoin

于 2011-10-25T14:27:42.750 に答える