2012-08-06 55 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