⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Prepared Statements

预编译语句是一种参数化查询。查询通过问号(?)或美元符号($1)来指示查询的参数。然后可以将值绑定到这些参数上,之后可以使用这些参数执行预编译语句。一个查询可以预编译一次并多次执行。

预编译语句对于以下情况非常有用:

  • 轻松为函数提供参数,同时避免字符串拼接/SQL注入攻击。
  • 加速将使用不同参数多次执行的查询。

DuckDB 支持在 C API 中使用 duckdb_prepare 方法来准备语句。duckdb_bind 系列函数用于为后续使用 duckdb_execute_prepared 执行准备好的语句提供值。当我们完成准备好的语句后,可以使用 duckdb_destroy_prepare 方法进行清理。

Example

duckdb_prepared_statement stmt;
duckdb_result result;
if (duckdb_prepare(con, "INSERT INTO integers VALUES ($1, $2)", &stmt) == DuckDBError) {
    // handle error
}

duckdb_bind_int32(stmt, 1, 42); // the parameter index starts counting at 1!
duckdb_bind_int32(stmt, 2, 43);
// NULL as second parameter means no result set is requested
duckdb_execute_prepared(stmt, NULL);
duckdb_destroy_prepare(&stmt);

// we can also query result sets using prepared statements
if (duckdb_prepare(con, "SELECT * FROM integers WHERE i = ?", &stmt) == DuckDBError) {
    // handle error
}
duckdb_bind_int32(stmt, 1, 42);
duckdb_execute_prepared(stmt, &result);

// do something with result

// clean up
duckdb_destroy_result(&result);
duckdb_destroy_prepare(&stmt);

调用duckdb_prepare后,可以使用duckdb_nparamsduckdb_param_type检查准备好的语句参数。如果准备失败,可以通过duckdb_prepare_error获取错误信息。

不需要duckdb_bind系列函数与预编译语句参数类型完全匹配。值将根据需要自动转换为所需的值。例如,在参数类型为DUCKDB_TYPE_INTEGER上调用duckdb_bind_int8将按预期工作。

警告 请不要使用预处理语句将大量数据插入DuckDB。相反,建议使用Appender

API Reference Overview

duckdb_state duckdb_prepare(duckdb_connection connection, const char *query, duckdb_prepared_statement *out_prepared_statement);
void duckdb_destroy_prepare(duckdb_prepared_statement *prepared_statement);
const char *duckdb_prepare_error(duckdb_prepared_statement prepared_statement);
idx_t duckdb_nparams(duckdb_prepared_statement prepared_statement);
const char *duckdb_parameter_name(duckdb_prepared_statement prepared_statement, idx_t index);
duckdb_type duckdb_param_type(duckdb_prepared_statement prepared_statement, idx_t param_idx);
duckdb_state duckdb_clear_bindings(duckdb_prepared_statement prepared_statement);
duckdb_statement_type duckdb_prepared_statement_type(duckdb_prepared_statement statement);

duckdb_prepare

从查询创建一个预处理语句对象。

请注意,在调用duckdb_prepare之后,即使准备失败,也应始终使用duckdb_destroy_prepare销毁准备好的语句。

如果准备失败,可以调用duckdb_prepare_error来获取准备失败的原因。

Syntax
duckdb_state duckdb_prepare(
  duckdb_connection connection,
  const char *query,
  duckdb_prepared_statement *out_prepared_statement
);
Parameters
  • connection: 连接对象
  • query: 要准备的SQL查询
  • out_prepared_statement: 生成的预编译语句对象
Return Value

DuckDBSuccess on success or DuckDBError on failure.


duckdb_destroy_prepare

关闭准备好的语句并释放为该语句分配的所有内存。

Syntax
void duckdb_destroy_prepare(
  duckdb_prepared_statement *prepared_statement
);
Parameters
  • prepared_statement: 要销毁的预处理语句。


duckdb_prepare_error

返回与给定预处理语句关联的错误消息。 如果预处理语句没有错误消息,则返回 nullptr

错误信息不应被释放。当调用duckdb_destroy_prepare时,它将被释放。

Syntax
const char *duckdb_prepare_error(
  duckdb_prepared_statement prepared_statement
);
Parameters
  • prepared_statement: 从中获取错误的预处理语句。
Return Value

The error message, or nullptr if there is none.


duckdb_nparams

返回可以提供给给定预处理语句的参数数量。

如果查询未成功准备,则返回0。

Syntax
idx_t duckdb_nparams(
  duckdb_prepared_statement prepared_statement
);
Parameters
  • prepared_statement: 要获取参数数量的预编译语句。


duckdb_parameter_name

返回用于标识参数的名称 返回的字符串应使用duckdb_free释放。

如果索引超出提供的预处理语句的范围,则返回NULL。

Syntax
const char *duckdb_parameter_name(
  duckdb_prepared_statement prepared_statement,
  idx_t index
);
Parameters
  • prepared_statement: 从中获取参数名称的预处理语句。


duckdb_param_type

返回给定索引处参数的类型。

如果参数索引超出范围或语句未成功准备,则返回DUCKDB_TYPE_INVALID

Syntax
duckdb_type duckdb_param_type(
  duckdb_prepared_statement prepared_statement,
  idx_t param_idx
);
Parameters
  • prepared_statement: 预编译的语句。
  • param_idx: 参数索引。
Return Value

参数类型


duckdb_clear_bindings

清除绑定到预处理语句的参数。

Syntax
duckdb_state duckdb_clear_bindings(
  duckdb_prepared_statement prepared_statement
);


duckdb_prepared_statement_type

返回要执行的语句的语句类型

Syntax
duckdb_statement_type duckdb_prepared_statement_type(
  duckdb_prepared_statement statement
);
Parameters
  • statement: 准备好的声明。
Return Value

duckdb_statement_type 值或 DUCKDB_STATEMENT_TYPE_INVALID