2

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

4

1 回答 1

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 语句中。

于 2012-08-06T16:18:49.547 回答