Groovy Sql para buscar todas las columnas
-
29-10-2019 - |
Pregunta
Estoy usando Groovy Sql para obtener resultados.Este es el resultado de mi máquina Linux.
%isql -U abc -P abc -S support
1> sp_configure 'number of open partitions'
2> go
Parameter Name Default Memory Used Config Value Run Value Unit Type
------------------------------ ----------- ----------- ------------ ------------ -------------------- ----------
number of open partitions 500 5201 5000 5000 number dynamic
(1 row affected)
(return status = 0)
1>
Estoy usando código maravilloso
def sql = Sql.newInstance("jdbc:abc:sybase://harley:6011;DatabaseName=support;",dbuname,dbpassword,Driver)
sql.eachRow("sp_configure 'number of open partitions'"){ row ->
println row.run_value
}
pero me da
Exception in thread "main" java.sql.SQLSyntaxErrorException: [abc][Sybase JDBC Driver]Invalid column name: run_value
Entonces dice que no puede obtener las columnas especificadas, ¿hay alguna manera de obtener el resultado y mostrarlo?
Actualizar
Usé el siguiente código
sql.eachRow("sp_configure 'number of open partitions'"){ row ->
println row
}
y me da
[Parameter Name:number of open partitions , Default: 500, Memory Used: 5201, Config Value: 5000, Run Value: 5000, Unit:number , Type:dynamic ]
Como puedo conseguir Run Value
?(ya que tiene un espacio en él)
row.Run Value
no funcionará con seguridad
Solución
¿Esto funciona?Consultando los metadatos para el nombre de la columna y obteniendo el valor por índice:
sql.eachRow("sp_configure 'number of open partitions'"){ row ->
(1..row.getMetaData().columnCount).each {
println "${row.metaData().getColumnName( it )} = ${row[ it ]}"
}
}
o, para obtener la columna directamente
row.'Run Value'
Otros consejos
Otra alternativa es Getat (int).En su caso, esto devolverá el 'valor de ejecución':
row.getAt(-3)
Además de la respuesta de @tim_yates, me gustaría señalar que row
tiene toRowResult()
método.Permite obtener una fila simplemente como un Mapa.No es necesario llamar getMetadata()
si solo necesitamos nombres de columnas o ancho de tabla.
sql.eachRow("sp_configure 'number of open partitions'"){ row ->
row.toRowResult().each(){ colName, value ->
println "${colName} = ${value}"
}
}
Este código hace exactamente lo mismo pero parece mucho más claro.