#oracle #sql #parallelism #sql-query

oracle_sql_tools

作为Rust-Oracle crate的扩展,使简单的查询易于实现

11个版本

0.2.0 2024年7月9日
0.1.34 2024年5月7日
0.1.33 2024年4月24日
0.1.4 2024年7月9日

#708数据库接口

MIT 许可证

41KB
680

Oracle SQL Tools

一个crate,它使简单的Oracle SQL查询易于集成到您的代码库中。作为Rust-oracle crate(必需)的扩展构建。

如何使用

设置依赖项

将这些添加到您的 cargo.toml 文件中

[dependencies]
oracle_sql_tools = "0.1"
oracle = "0.5"
# chrono is required if you're working with dates 
chrono = "0.4"

为本地枚举实现 FormatData Trait

要在使用您创建的枚举作为值的向量或网格上使用 .prep_data() 方法,您需要为它实现 FormatData trait。

enum MyEnum {
    VARCHAR(String),
    NUMBER(i64)
}

impl FormatData for MyEnum {
    fn fmt_data(self) -> FormattedData {
        match self {
            MyEnum::VARCHAR(val) => FormattedData::STRING(val.into()),
            MyEnum::NUMBER(val) => FormattedData::INT(val.into()),
        }
    }
}

为外部枚举实现 FormatData Trait

如果您需要在一个导入的crate中的枚举上实现此trait

use some_crate::SomeForeignType;

struct MyType<'a>(&'a SomeForeignType);

impl FormatData for MyType<'_> {
    fn fmt_data(self) -> FormattedData {
        match self.0 {
            MyType(SomeForeignType::Int(val)) => FormattedData::INT(*val),
            MyType(SomeForeignType::Float(val)) => FormattedData::FLOAT(*val),
            MyType(SomeForeignType::String(val)) => FormattedData::STRING(val.to_owned()),
            MyType(SomeForeignType::Date(val)) => FormattedData::DATE(*val),
            MyType(SomeForeignType::DateTime(val)) => FormattedData::TIMESTAMP(*val),
            MyType(SomeForeignType::None) => FormattedData::EMPTY,
        }
    }
}

示例

选择

let conn: oracle::Connection = match Connection::connect("<USERNAME>", "<PASSWORD>", "<IP ADDRESS>")?; 

let col_names: Vec<&str> = vec!["Employee ID", "Name", "Job Title", "Department", "Business Unit"];

let table_data: Vec<Vec<Option<String>>> = col_names.prep_data(conn).select("MY_TABLE")?;

与以下相同

SELECT employee_id, name, job_title, department, business_unit FROM my_table;

插入

let conn: oracle::Connection = match Connection::connect("<USERNAME>", "<PASSWORD>", "<IP ADDRESS>")?; 

let data: Vec<Vec<String>> = vec![
    vec!["ColA".to_string(), "ColB".to_string(), "ColC".to_string()],
    vec!["A1".to_string(), "B1".to_string(), "C1".to_string()],
    vec!["A2".to_string(), "B2".to_string(), "C2".to_string()],
    vec!["A3".to_string(), "B3".to_string(), "C3".to_string()],
];

// `res` is [oracle::Connection] that's Atomically Reference Counted 
let res: Arc<Connection> = data.prep_data(conn).insert("MY_TABLE")?;
// `res` has the executed Batch(es), you only need to commit it
res.commit()?;
Ok(())

与以下相同

INSERT ALL
    INTO my_table (ColA, ColB, ColC) VALUES ('A1', 'B1', 'C1')
    INTO my_table (ColA, ColB, ColC) VALUES ('A2', 'B2', 'C2')
    INTO my_table (ColA, ColB, ColC) VALUES ('A3', 'B3', 'C3')
SELECT 1 FROM dual;

或在 Oracle 23c

INSERT INTO my_table (ColA, ColB, ColC) VALUES 
('A1', 'B1', 'C1'),
('A2', 'B2', 'C2'),
('A3', 'B3', 'C3');

依赖项

~8–16MB
~202K SLoC