[−][src]Struct sibyl::Cursor
Cursors - implicit results and REF CURSOR - from an executed PL/SQL statement
Methods
impl<'a> Cursor<'a>
[src]
pub fn new(stmt: &'a dyn Stmt) -> Result<Self>
[src]
Creates a Cursor that can be used as an OUT argument to receive a returning REF CURSOR.
Example
use sibyl::{Cursor, Number}; use std::cmp::Ordering::Equal; let stmt = conn.prepare(" BEGIN OPEN :lowest_payed_employee FOR SELECT department_name, first_name, last_name, salary FROM ( SELECT first_name, last_name, salary, department_id , ROW_NUMBER() OVER (ORDER BY salary) ord FROM hr.employees ) e JOIN hr.departments d ON d.department_id = e.department_id WHERE ord = 1 ; OPEN :median_salary_employees FOR SELECT department_name, first_name, last_name, salary FROM ( SELECT first_name, last_name, salary, department_id , MEDIAN(salary) OVER () median_salary FROM hr.employees ) e JOIN hr.departments d ON d.department_id = e.department_id WHERE salary = median_salary ORDER BY department_name, last_name, first_name ; END; ")?; let mut lowest_payed_employee = Cursor::new(&stmt)?; let mut median_salary_employees = Cursor::new(&stmt)?; stmt.execute_into(&[], &mut [ &mut ( ":lowest_payed_employee", &mut lowest_payed_employee ), &mut ( ":median_salary_employees", &mut median_salary_employees ), ])?; let rows = lowest_payed_employee.rows()?; let row = rows.next()?; assert!(row.is_some()); let row = row.unwrap(); let department_name = row.get::<&str>(0)?.unwrap(); assert_eq!(department_name, "Shipping"); let first_name = row.get::<&str>(1)?; assert!(first_name.is_some()); let first_name = first_name.unwrap(); assert_eq!(first_name, "TJ"); let last_name = row.get::<&str>(2)?.unwrap(); assert_eq!(last_name, "Olson"); let salary = row.get::<Number>(3)?.unwrap(); let expected = Number::from_int(2100, &oracle); assert!(salary.cmp(&expected)? == Equal); let row = rows.next()?; assert!(row.is_none()); let rows = median_salary_employees.rows()?; let row = rows.next()?; assert!(row.is_some()); let row = row.unwrap(); let department_name = row.get::<&str>(0)?.unwrap(); assert_eq!(department_name, "Sales"); let first_name = row.get::<&str>(1)?; assert!(first_name.is_some()); let first_name = first_name.unwrap(); assert_eq!(first_name, "Amit"); let last_name = row.get::<&str>(2)?.unwrap(); assert_eq!(last_name, "Banda"); let expected = Number::from_int(6200, &oracle); let salary = row.get::<Number>(3)?.unwrap(); assert!(salary.cmp(&expected)? == Equal); let row = rows.next()?; assert!(row.is_some()); let row = row.unwrap(); let department_name = row.get::<&str>(0)?.unwrap(); assert_eq!(department_name, "Sales"); let first_name = row.get::<&str>(1)?; assert!(first_name.is_some()); let first_name = first_name.unwrap(); assert_eq!(first_name, "Charles"); let last_name = row.get::<&str>(2)?.unwrap(); assert_eq!(last_name, "Johnson"); let salary = row.get::<Number>(3)?.unwrap(); assert!(salary.cmp(&expected)? == Equal); let row = rows.next()?; assert!(row.is_none());
See also Statement::next_result
for another method to return REF CURSORs.
pub fn rows(&self) -> Result<Rows>
[src]
Returns rows selected by this cursor
Example
use sibyl::Cursor; let stmt = conn.prepare(" SELECT last_name , CURSOR( SELECT department_name FROM hr.departments WHERE department_id IN ( SELECT department_id FROM hr.employees WHERE last_name = e.last_name) ORDER BY department_name ) AS departments FROM ( SELECT distinct last_name FROM hr.employees WHERE last_name = :last_name ) e ")?; let rows = stmt.query(&[ &"King" ])?; let row = rows.next()?; assert!(row.is_some()); let row = row.unwrap(); let last_name = row.get::<&str>(0)?.unwrap(); assert_eq!(last_name, "King"); let departments = row.get::<Cursor>(1)?.unwrap(); let dept_rows = departments.rows()?; let dept_row = dept_rows.next()?; assert!(dept_row.is_some()); let dept_row = dept_row.unwrap(); let department_name = dept_row.get::<&str>(0)?.unwrap(); assert_eq!("Executive", department_name); let dept_row = dept_rows.next()?; assert!(dept_row.is_some()); let dept_row = dept_row.unwrap(); let department_name = dept_row.get::<&str>(0)?.unwrap(); assert_eq!("Sales", department_name); let dept_row = dept_rows.next()?; assert!(dept_row.is_none()); let row = rows.next()?; assert!(row.is_none());
Trait Implementations
impl<'_> Env for Cursor<'_>
[src]
impl<'_> ToSqlOut for Cursor<'_>
[src]
fn to_sql_output(&mut self, _col_size: usize) -> (u16, *mut c_void, usize)
[src]
fn set_len(&mut self, _new_len: usize)
[src]
Called to set the received data length (always less than the initial capacity)
impl<'a> FromSql<'a> for Cursor<'a>
[src]
impl<'_> Conn for Cursor<'_>
[src]
fn srv_ptr(&self) -> *mut OCIServer
[src]
fn svc_ptr(&self) -> *mut OCISvcCtx
[src]
fn usr_ptr(&self) -> *mut OCISession
[src]
impl<'_> Stmt for Cursor<'_>
[src]
Auto Trait Implementations
Blanket Implementations
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> From<T> for T
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,