Prepared Statements¶
The PREPARE
statement allows for the creation and storage of a SQL statement with placeholder arguments.
The prepared statements can then be executed repeatedly in an efficient manner.
SQL Example
Create a prepared statement greater_than
that selects all records where column “a” is greater than the parameter:
PREPARE greater_than(INT) AS SELECT * FROM example WHERE a > $1;
The prepared statement can then be executed with parameters as needed:
EXECUTE greater_than(20);
Rust Example
use datafusion::prelude::*;
#[tokio::main]
async fn main() -> datafusion::error::Result<()> {
// Register the table
let ctx = SessionContext::new();
ctx.register_csv("example", "tests/data/example.csv", CsvReadOptions::new()).await?;
// Create the prepared statement `greater_than`
let prepare_sql = "PREPARE greater_than(INT) AS SELECT * FROM example WHERE a > $1";
ctx.sql(prepare_sql).await?;
// Execute the prepared statement `greater_than`
let execute_sql = "EXECUTE greater_than(20)";
let df = ctx.sql(execute_sql).await?;
// Execute and print results
df.show().await?;
Ok(())
}
Inferred Types¶
If the parameter type is not specified, it can be inferred at execution time:
SQL Example
Create the prepared statement greater_than
PREPARE greater_than AS SELECT * FROM example WHERE a > $1;
Execute the prepared statement greater_than
EXECUTE greater_than(20);
Rust Example
// Create the prepared statement `greater_than`
let prepare_sql = "PREPARE greater_than AS SELECT * FROM example WHERE a > $1";
ctx.sql(prepare_sql).await?;
// Execute the prepared statement `greater_than`
let execute_sql = "EXECUTE greater_than(20)";
let df = ctx.sql(execute_sql).await?;
Positional Arguments¶
In the case of multiple parameters, prepared statements can use positional arguments:
SQL Example
Create the prepared statement greater_than
PREPARE greater_than(INT, DOUBLE) AS SELECT * FROM example WHERE a > $1 AND b > $2;
Execute the prepared statement greater_than
EXECUTE greater_than(20, 23.3);
Rust Example
// Create the prepared statement `greater_than`
let prepare_sql = "PREPARE greater_than(INT, DOUBLE) AS SELECT * FROM example WHERE a > $1 AND b > $2";
ctx.sql(prepare_sql).await?;
// Execute the prepared statement `greater_than`
let execute_sql = "EXECUTE greater_than(20, 23.3)";
let df = ctx.sql(execute_sql).await?;