2013-04-09 95 views
0

我想通過DBI更新Oracle中的某些記錄。這是我嘗試:Perl DBI Oracle like wilddcard

my $q = $dbh->prepare("UPDATE table SET period='$PERIOD' WHERE field LIKE '%$PERIOD_FIELD'"); $q->execute();

的問題是,在變量$ PERIOD_FIELD來是這樣的:「@@ XYZ @ ASD ASD ASD」

所以我想更新所有記錄這是場列以somthing + $ PERIOD_FIELD結尾。

當perl到達行:$q->execute();它只是凍結,我不得​​不停止與ctrl + c程序運行。

我知道問題與字符%(因爲程序不會凍結,如果我刪除它),但我無法弄清楚如何正確調用腳本。

有沒有人有對我的提示? 謝謝!

+0

在將Perl傳遞給準備之前,您是否嘗試將Perl連接到Period_Field? – xQbert 2013-04-09 14:34:41

+0

是的,都來自perl。並且也在與oracle的oracle中。我也試圖綁定它,但迄今爲止沒有成功。 :( – 2013-04-09 14:35:38

+0

除非出現網絡連接問題,否則我很少看到DBI調用「freeze」。如果Oracle不喜歡你的SQL,那麼你會得到一個直接的錯誤。檢查你運行Perl的主機和Oracle主機之間的防火牆。我唯一的預感是這可能是一個超級大的數據集,並且UPDATE只是永遠存在,似乎凍結了這個過程。 – Marcus 2013-04-10 01:24:18

回答

0

事實證明,所有上述代碼是正確的,但不幸的是表被鎖定的蟾蜍。 :|在Toad中執行回滾或提交或關閉Toad解決了這個問題。

謝謝大家的提示和遺憾的錯誤指導。

0
my $q = $dbh->prepare("UPDATE table SET period='$PERIOD' WHERE field LIKE chr(37)||'$PERIOD_FIELD'"); 
$q->execute(); 
+0

如果我理解正確,比chr(37)是一個perl函數返回字符%。在你的例子中你是從一個字符串內部調用它,所以我想這是行不通的。當我將它轉換爲:'my $ q = $ dbh-> prepare(「UPDATE table SET period ='$ PERIOD'WHERE field LIKE」。chr(37)。「||'$ PERIOD_FIELD'「);' Oracle不喜歡它:ORA-00911:無效字符 – 2013-04-09 14:52:01

+0

@SandorFarkas - 'chr()'是Oracle函數。 – 2013-04-09 14:54:07

+0

你說得對,謝謝。它的工作原理是Toad,但不幸的是它仍然受到Perl的困擾。 – 2013-04-09 15:03:54