在DBI'的selectcol_arrayref & Co.中使用命名的占位符是否可行?[英] Possible to use named placeholders in DBI's selectcol_arrayref & Co.?

本文是小编为大家收集整理的关于在DBI'的selectcol_arrayref & Co.中使用命名的占位符是否可行?的处理方法,想解了在DBI'的selectcol_arrayref & Co.中使用命名的占位符是否可行?的问题怎么解决?在DBI'的selectcol_arrayref & Co.中使用命名的占位符是否可行?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

是否可以在某种程度上使用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.

推荐答案

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

占位符和绑定值

一些驱动程序支持占位符和绑定值.
[...]
一些驱动程序还允许占位符:name 和:n (例如,:1 ,:2 ,所以除?外),但它们的使用不可移植.

但是,您很幸运, postgresql driver 命名或编号参数的支持:

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

sqlite driver 也支持他们:

sqlite支持几种占位符表达式,包括?和:aaaa.

不利的一面是,您最终将使用bind_param与命名参数使用很多,因此您将无法使用selectcol_arrayref和$sth->execute(1,2,3)之类的便利性(注意:如果有人知道如何使用execute使用指定的占位符,我会在评论中欣赏一些提示,我从来没有想出如何做到这一点).但是,您可以使用各种形式的数字占位符(例如postgresql或select c from t where x = ?1的select c from t where x = $1).

还要注意,PostgreSQL使用结肠为某些操作员使用阵列切片和问号,因此有时标准?占位符和:名称名为占位符的占位符可能引起问题.我从来没有任何问题? rel =" nofollow noreferrer">几何算子;我怀疑明智的使用空格会避免?的任何问题.如果您不使用PostgreSQL数组,那么您可能不必担心阵列切片与您的:name战斗.


执行摘要:您不能使用具有selectcol_arrayref>的占位符或与@bind_params一起使用的类似方法.但是,使用sqlite和postgresql,您可以使用编号的占位符($1,?1,...用于postgresql或?1,?2,?2,用于sqlite),用于@bind_params或者,如果您很高兴使用较长的prepare/bind_param/execute/fetch方法,则可以使用名为占位符(:name :name)如果您在查询中使用PostgreSQL数组.

本文地址:https://www.itbaoku.cn/post/1764035.html