【问题标题】:Parameters can't be passed in when using perl DBI to create view使用perl DBI创建视图时不能传入参数
【发布时间】:2012-08-06 16:06:59
【问题描述】:

我想使用 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。

【问题讨论】:

  • 尝试与RaiseError => 1 连接。某些驱动程序不支持视图中的参数(但不确定 Oracle)。

标签: sql perl dbi dbd


【解决方案1】:

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

【讨论】:

  • 感谢乔纳森的即时回复。似乎我必须找到一种方法来通过而不使用自动创建这些视图。
  • 我已经重试了类似下面的方式.. my $dbh = DBI->connect("dbi:Oracle:$database", $user_passwd);我的 $Directive = q{ CREATE OR REPLACE VIEW SOME_VIEW AS SELECT * FROM ID_TABLE WHERE ID=?};我的 $ID = '12345';我的 $sth = $dbh->prepare($Directive.$ID);我的 $rv = $sth->execute(); ...这部分代码运行良好。从这里我认为函数 $stch->execute() 无法将参数放在它们应该在的位置。有线。
  • 将 RaiseError 添加到您的连接中,当您调用执行时,您将得到类似“ORA-01027:数据定义操作不允许绑定变量”的信息。重读乔纳森的帖子——你不能做你想做的事——甲骨文不允许你这样做。
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2013-03-30
  • 2021-10-09
  • 1970-01-01
  • 2013-04-06
  • 2020-01-17
  • 2013-07-21
相关资源
最近更新 更多