在某种程度上可以使用DBI允许@bind_values的命名占位符吗? E. g。,我想发表如下声明:
my $s = $DB->selectcol_arrayref ("SELECT a FROM b
WHERE c = ? OR d = ? OR e = ?;",
{},
$par1, $par2, $par1) or
die ($DB->errstr ());
不容易出错。我正在使用DBD :: Pg和DBD :: SQLite。
答案 0 :(得分:6)
支持哪种占位符(如果有)depends on the driver:
占位符和绑定值
某些驱动程序支持占位符和绑定值 [...]
一些驱动程序还允许占位符,如:name 和:N (例如,:1 ,:2 ,等等除了?之外,它们的使用是不可移植的。
但是你很幸运,PostgreSQL driver支持命名或编号参数:
可以在DBD :: Pg中使用三种类型的占位符。第一种是“问号”类型,其中每个占位符由单个问号字符表示 [...]
方法第二种占位符是“美元符号” [...]
最终的占位符类型是“命名参数”,格式为“:foo”。
SQLite driver也支持他们:
SQLite支持多个占位符表达式,包括?并且:AAAA。
缺点是您最终会使用bind_param
对命名参数进行大量使用,因此您将无法使用selectcol_arrayref
和$sth->execute(1,2,3)
等便利设施(注意:如果有人知道如何使用execute
命名占位符,我会很感激评论中的一些指示,我从来没有想过如何做到这一点)。但是,您可以使用各种形式的数字占位符(例如select c from t where x = $1
用于PostgreSQL或select c from t where x = ?1
用于SQLite)。
另请注意,PostgreSQL对某些运算符使用冒号作为数组切片和问号,因此有时标准?占位符和:name 命名占位符可能会导致问题。我从未遇到任何与相关的问题?但我从未使用geometric operators;我怀疑合理使用空格可以避免?的任何问题。如果你没有使用PostgreSQL数组,那么你可能不必担心array slices与你的:name
命名占位符作斗争。
执行摘要:您不能使用selectcol_arrayref
命名占位符或与@bind_params
一起使用的类似方法。但是,使用SQLite和Postgresql,您可以使用带编号的占位符($1
,$2
,...用于Postgresql或?1
,?2
,...用于SQLite)如果您对使用较长@bind_params
/ :name
/ {{感到满意的话感到高兴,那么使用prepare
的方法或者您可以使用命名占位符(bind_param
同时用于PostgreSQL和SQLite) 1}} / execute
方法序列,如果在查询中使用PostgreSQL数组,则必须小心。