为什么 perl DBI 会在预准备语句 (Oracle) 中添加特殊字符 <*>(小于星号大于)?



我想使用带有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 = ?';
...

最新更新