Convert recordset to Vec of Columns
alessio-zamparelli opened this issue · 1 comments
alessio-zamparelli commented
Hi,
i'd like to convert a resultset to a vector of vector by columns without knowing the return type of the query:
let sql = "SELECT * FROM EMPLOYEES";
let mut stmt = conn.statement(sql).build()?;
let rows = stmt.query(&[])?;
let num_cols = rows.column_info().len();
let mut columns: Vec<Vec<Box<dyn ToSql>>> = Vec::with_capacity(100);
for _ in 0..num_cols {
columns.push(Vec::new());
}
for info in rows.column_info() {
println!("{} -> {}", info.name(), info.oracle_type());
}
for (row_idx, row_result) in rows.enumerate() {
let row = row_result?;
for (col_idx, value) in row.sql_values().iter().enumerate() {
let value: Box<dyn ToSql> = match value.oracle_type()? {
OracleType::Varchar2(_) => Box::new(row.get::<_, String>(col_idx)?),
OracleType::Number(..) => Box::new(row.get::<_, i64>(col_idx)?),
OracleType::Int64 => Box::new(row.get::<_, i64>(col_idx)?),
OracleType::Float(_) => Box::new(row.get::<_, f64>(col_idx)?),
OracleType::Date => Box::new(row.get::<_, NaiveDate>(col_idx)?),
_ => {
println!("Unsupported column type {}", value.oracle_type()?);
Box::new("")
}
};
columns[col_idx].push(value);
}
}
but give error Error: NullValue
kubo commented
See doc for Error::NullValue
. Use Option<i64>
, Option<f64>
and so on.