2011-10-17 49 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模块)进行了广泛的测试和真实世界使用。让它担心如何让你的文本插入到数据库中。