我想使用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可以毫无问题地传入。
答案 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语句中。