私は、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)
です。