kubo/rust-oracle

Convert recordset to Vec of Columns

alessio-zamparelli opened this issue · 1 comments

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.