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?;