2011-10-17 46 views
1

我需要操縱DB中的一些記錄,並將他們的值寫入另一個表。其中一些值的字符串中有'&',即'我&您'。沒有找到所有這些值並在任何&之前放置一個\,如何將這些值插入到無法在&上扼制的oracle的表中?轉義和在Perl數據庫查詢

+0

你看過http://stackoverflow.com/questions/1137354/oracle-pl-sql-escape-character-for- – vol7ron

+0

如果您使用DBI,則使用bind_param()將值引入表中。 (我假設你正在建設一個查詢字符串並將其傳遞到批發準備/執行? –

回答

12

使用佔位符。不要把'$who'放在你的SQL語句中,而要準備一個?在那裏,然後綁定$ who,或者用$ who作爲適當的參數執行。

my $sth = $dbh->prepare_cached('INSERT INTO FOO (WHO) VALUES (?)'); 
$sth->bind_param(1, $who); 
my $rc = $sth->execute(); 

這比自己嘗試做起來更安全,更快速。 (DBI中有一個「引用」方法,但這比這更好。)

+0

這得到了它。感謝 – Lazloman

+1

*這*參見http://bobby-tables.com/perl.html –

+1

我最喜歡的單一特徵Oracle被命名爲佔位符:'my $ sth = $ dbh-> prepare_cached('INSERT INTO FOO(WHO)VALUES(:who)');''$ sth-> bind_param(':who',$ who);'This降低了SQL的可移植性,但是如果您已經與Oracle緊密相連,它可以極大地提高可維護性。 –

8

這絕對是一個你不需要重塑的車輪。如果您使用的是DBI,請勿逃避輸入;使用佔位符。

實施例:

my $string = "database 'text' with &special& %characters%"; 
my $sth = $dbh->prepare("UPDATE some_table SET some_column=? 
         WHERE some_other_column=42"); 
$sth->execute($string); 

DBD::Oracle模塊(以及所有其他DBD::xxxxx模塊)進行了廣泛的測試和真實世界使用。讓它擔心如何讓你的文本插入到數據庫中。