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(()) }
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
# use datafusion::prelude::*; # #[tokio::main] # async fn main() -> datafusion::error::Result<()> { # 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 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?; # # Ok(()) # }
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
# use datafusion::prelude::*; # #[tokio::main] # async fn main() -> datafusion::error::Result<()> { # 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, 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?; # Ok(()) # }