2012-08-06 56 views
2

我想使用Perl DBI自动创建基于数据库的视图。相关的代码是类似以下,使用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时,一切都很好。

BTW,当我使用一些其他的$指令,如 “SELECT * FROM ID_TABLE WHERE ID =?”,参数$ ID,可以在没有任何问题过去了。

+1

尝试使用'RaiseError => 1'连接。有些驱动程序不支持视图中的参数(不过,不确定Oracle)。 – choroba 2012-08-06 16:17:58

回答

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语句的参数值。

+0

感谢乔纳森的直接回应。似乎我必须找到一种方法来传递而不使用自动创建这些视图。 – user1579740 2012-08-06 16:31:35

+0

我重试的方式如下..我的$ 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。$ ID); my $ rv = $ sth-> execute(); ...这部分代码运行良好。从这里我认为函数$ stch-> execute()不能将参数放到它们应该在的位置。有线。 – user1579740 2012-08-06 16:42:19

+0

将RaiseError添加到连接中,当调用execute时,您将得到类似“ORA-01027:数据定义操作不允许的绑定变量”的内容。重读乔纳森的文章 - 你不能做你想做的事情 - 甲骨文不允许你这样做。 – bohica 2012-08-07 08:14:29