可以在DBI的selectcol_arrayref&Co.中使用命名占位符吗?

Tim*_*idt 3 sqlite postgresql perl dbi

在某种程度上可以使用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 ());
Run Code Online (Sandbox Code Playgroud)

不容易出错.我正在使用DBD :: Pg和DBD :: SQLite.

mu *_*ort 6

支持哪种占位符(如果有)取决于驱动程序:

占位符和绑定值

一些驱动程序支持占位符和绑定值.
[...]
有些驱动程序还允许使用占位符,例如:name:N(例如:1,:2,依此类推)除了,但它们的使用不便携.

但是你很幸运,PostgreSQL驱动程序支持命名或编号参数:

可以在DBD :: Pg中使用三种类型的占位符.第一种是"问号"类型,其中每个占位符由单个问号字符表示.
[...]
方法第二种占位符是"美元符号".
[...]
最终占位符类型是"命名参数",格式为":foo".

SQLite驱动程序也支持它们:

SQLite支持多个占位符表达式,包括?并且:AAAA.

缺点是你最终会使用bind_param命名参数很多,所以你将无法使用像selectcol_arrayref和那样的便利$sth->execute(1,2,3)(注意:如果有人知道如何使用命名占位符,execute我会感谢评论中的一些指示,我从来没有想过如何做到这一点).但是,您可以使用各种形式的数字占位符(例如select c from t where x = $1PostgreSQL或select c from t where x = ?1SQLite).

还要注意PostgreSQL对一些运算符的数组切片和问号使用冒号,所以有时标准占位符和:名称占位符的名称可能会导致问题.我从来没有遇到任何问题但我从来没有使用几何运算符 ; 我怀疑合理使用空格可以避免任何问题吗?.如果您没有使用PostgreSQL数组,那么您可能不必担心与命名占位符争用的数组切片:name.


执行摘要:您不能使用命名占位符selectcol_arrayref或使用相似的方法@bind_params.但是,使用SQLite和Postgresql,您可以使用编号的占位符($1,$2...,对于Postgresql或?1,?2...,对于SQLite)与使用的方法,@bind_params或者您可以使用命名占位符(:name对于PostgreSQL和SQLite),如果您很高兴使用更长的prepare/ bind_param/ execute/ fetch序列方法,如果在查询中使用PostgreSQL数组,则必须小心.