1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
| use oracle::{Connection, Error, ErrorKind};
#[derive(Debug)] struct Employee { id: i64, name: String, salary: f64, }
fn connect() -> Result<Connection, Error> { Connection::connect("username", "password", "TEST2") }
fn create_table(conn: &Connection) -> Result<(), Error> { let statements = [ "BEGIN EXECUTE IMMEDIATE 'CREATE TABLE employees ( id NUMBER PRIMARY KEY, name VARCHAR2(100) NOT NULL, salary NUMBER(10,2) )'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -955 THEN -- ORA-00955: name already used RAISE; END IF; END;", "BEGIN EXECUTE IMMEDIATE 'CREATE SEQUENCE employees_seq START WITH 1 INCREMENT BY 1'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -955 THEN -- ORA-00955: name already used RAISE; END IF; END;", "BEGIN EXECUTE IMMEDIATE ' CREATE OR REPLACE TRIGGER employees_bir BEFORE INSERT ON employees FOR EACH ROW WHEN (NEW.id IS NULL) BEGIN SELECT employees_seq.NEXTVAL INTO :NEW.id FROM dual; END;'; END;", ];
for sql in statements { conn.execute(sql, &[])?; } Ok(()) }
fn create_employee(conn: &Connection, name: &str, salary: f64) -> Result<i64, Error> { let stmt = conn.execute( "INSERT INTO employees (name, salary) VALUES (:1, :2) RETURNING id INTO :3", &[&name, &salary, &None::<i64>], )?; conn.commit()?; let ids: Vec<i64> = stmt.returned_values(3)?; Ok(ids[0]) }
fn get_employee(conn: &Connection, id: i64) -> Result<Option<Employee>, Error> { let row = conn.query_row_as::<(i64, String, f64)>( "SELECT id, name, salary FROM employees WHERE id = :1", &[&id], );
match row { Ok((id, name, salary)) => Ok(Some(Employee { id, name, salary })), Err(e) if e.kind() == ErrorKind::NoDataFound => Ok(None), Err(e) => Err(e), } }
fn get_all_employees(conn: &Connection) -> Result<Vec<Employee>, Error> { let mut employees = Vec::new(); let rows = conn.query_as::<(i64, String, f64)>( "SELECT id, name, salary FROM employees ORDER BY id", &[], )?;
for row_result in rows { let (id, name, salary) = row_result?; employees.push(Employee { id, name, salary }); } Ok(employees) }
fn update_employee_salary(conn: &Connection, id: i64, new_salary: f64) -> Result<u64, Error> { let stmt = conn.execute( "UPDATE employees SET salary = :1 WHERE id = :2", &[&new_salary, &id], )?; conn.commit()?; Ok(stmt.row_count()?) }
fn delete_employee(conn: &Connection, id: i64) -> Result<u64, Error> { let stmt = conn.execute("DELETE FROM employees WHERE id = :1", &[&id])?; conn.commit()?; Ok(stmt.row_count()?) }
fn main() -> Result<(), Error> { let conn = connect()?; create_table(&conn)?;
let id = create_employee(&conn, "Alice Johnson", 75000.0)?; println!("Inserted employee with id = {}", id);
let id2 = create_employee(&conn, "Bob Smith", 62000.0)?; println!("Inserted employee with id = {}", id2);
if let Some(emp) = get_employee(&conn, id)? { println!("Fetched: {:?}", emp); }
println!("All employees:"); for emp in get_all_employees(&conn)? { println!(" {:?}", emp); }
let updated = update_employee_salary(&conn, id, 80000.0)?; println!("Rows updated: {}", updated);
let deleted = delete_employee(&conn, id2)?; println!("Rows deleted: {}", deleted);
Ok(()) }
|