使用perl DBI创建视图时,无法传入参数

时间:2012-08-06 16:06:59

标签: sql perl dbi dbd

我想使用Perl DBI自动创建基于数据库的视图。相关代码如下,

my $dbh       = DBI->connect( "dbi:Oracle:$database", $user_passwd );
my $Directive = q{ CREATE OR REPLACE VIEW SOME_VIEW AS SELECT * FROM ID_TABLE WHERE ID=?};
my $ID = 12345;

my $sth = $dbh->prepare($Directive);
my $rv  = $sth->execute($ID);

然后我在运行代码后发现$rv总是undef。我在代码中做错了什么?当我将参数直接放入$Directive时,一切都很好。

顺便说一句,当我使用其他一些$ Directive时,比如“SELECT * FROM ID_TABLE WHERE ID =?”,参数$ ID可以毫无问题地传入。

1 个答案:

答案 0 :(得分:2)

SQL不允许在条件中使用占位符创建视图,如示例中所示。除此之外,没有一个表示法允许您在引用视图时指定占位符的值。 DDL语句通常不接受输入参数。

你必须以不同的方式做事,可能在视图之前。

这不是Perl或DBI本身的限制,甚至也不是您正在使用的特定DBMS;这是SQL整体设计的一个问题。


处理这个特定案例的最简单方法是:

my $dbh = DBI->connect( "dbi:Oracle:$database", $user_passwd );
my $ID = 12345;
my $sql = qq{ CREATE OR REPLACE VIEW SOME_VIEW AS SELECT * FROM ID_TABLE WHERE ID = $ID };

my $sth = $dbh->prepare($sql);
my $rv  = $sth->execute();

只需将参数的值嵌入到您准备和执行的SQL语句中。