我想使用带有perl DBI(版本5.16.3(的准备好的语句来更新Oracle数据库表中的一行。
my $query = 'update THE_TABLE set (COLUMN_ONE = ?, COLUMN_TWO = ?,
MODIFY_DATE = SYSDATE) where ID = ?';
my $statement_update = $db_handle->prepare($query) or die 'DB Error: ' . $db_handle->errstr;
$statement_update->execute(1, 1, '123456789') or die 'DB Error: ' . $statement_update->errstr;
执行时,perl-DBI会添加一个特殊的<*>语句的符号组,并且导致错误:
DBD::Oracle::st execute failed: ORA-00907: missing right parenthesis (DBD ERROR: error possibly near <*> indicator at char 31 in 'update THE_TABLE set (COLUMN_ONE <*>= :p1, COLUMN_TWO = :p2, MODIFY_DATE = SYSDATE) where ID = :p3') [for Statement "update THE_TABLE set (COLUMN_ONE = ?, COLUMN_TWO = ?, MODIFY_DATE = SYSDATE) where ID = ?" with ParamValues: :p1=1, :p2=1, :p3='123456789'] at a_perl_script.pl line ...
使用symbolhound,我可以找到这个页面,在那里,其他人似乎遇到了同样的事情。而且它看起来是随机的,perl-DBI将<*>符号。
如何调整perl-DBI以正确地生成此语句?
perl-DBI正在添加一个特殊的<*>语句的符号组,并且导致错误
恐怕你完全错了。首先,添加符号的不是Perl,而是Oracle查询编译器。其次,这些符号并不是导致错误的原因,它们向您展示了Oracle认为错误的位置
请仔细查看错误消息。上面写着:
DBD错误:错误可能在<*>附近指示器
"指示器"这个词就是你的线索。它已经被添加到"指示"错误的位置。
正如您已经被告知的那样,解决方案是从查询中删除不必要的括号。
精度和准确性是成为一名专业程序员的重要组成部分。你需要习惯于阅读和理解错误信息,而不仅仅是跳到脑海中第一个可能的解释上。
它不会将该符号插入到执行的查询中。它只是错误消息中的一个标记,指示语法错误的位置,方便您更容易找到那个位置。
若要消除该错误,请从查询中删除括号。
...
my $query = 'update THE_TABLE set COLUMN_ONE = ?, COLUMN_TWO = ?,
MODIFY_DATE = SYSDATE where ID = ?';
...