可以在DBI的selectcol_arrayref&中使用命名占位符。公司?

时间:2011-12-25 00:10:14

标签: perl sqlite postgresql 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 ());

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

1 个答案:

答案 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数组,则必须小心。

相关问题