SPI_execute_with_args — 执行带行外参数的命令
int SPI_execute_with_args(const char *command, intnargs, Oid *argtypes, Datum *values, const char *nulls, boolread_only, longcount)
SPI_execute_with_args 执行一条可能包含对
外部提供的参数的引用的命令。
命令文本以
$ 引用一个参数,
调用为每个这样的符号指定数据类型和值。
nread_only 和
count 的解释与
SPI_execute 中相同。
与
SPI_execute 相比,这个例程的主要优点是:
数据值可以被插入命令而无需繁琐的加引号/转义,
从而大幅降低 SQL 注入攻击的风险。
使用
SPI_prepare 加
SPI_execute_plan 也能达到类似的效果;
不过,使用这个函数时,查询计划总是针对提供的特定参数值
定制。
对于一次性查询执行,应当优先使用这个函数。
如果同一条命令要用许多不同的参数执行,
两种方法哪种更快取决于重新规划的成本与定制计划的收益之间的
权衡。
const char * command命令字符串
int nargs
输入参数的数量
(
$1、
$2 等)
Oid * argtypes
一个长度为
nargs 的数组,包含参数的数据类型的
OID
Datum * values
一个长度为
nargs 的数组,包含实际的参数
值
const char * nulls
一个长度为
nargs 的数组,描述哪些参数是
空的
如果
nulls 为
NULL,则
SPI_execute_with_args 假定没有参数是
空的。
否则,
nulls
数组的每个条目在相应参数值非空时应为
' ',在相应参数值为空时应为
'n'。
(在后一种情况下,相应
values 条目中的实际值无关紧要。)
注意,
nulls 不是一个文本字符串,只是一个
数组:它不需要
'\0' 终止符。
bool read_onlytrue 表示只读执行
long count
要返回的最大行数,
0 表示没有限制
返回值与
SPI_execute 相同。
成功时,
SPI_processed 和
SPI_tuptable 的设置方式与
SPI_execute 相同。