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

Why does perl DBI adds special characters <*> (less than asterisk greater than) to prepared statement (Oracle)?

我想使用带有 perl DBI(版本 5.16.3)的准备好的语句来更新 Oracle 数据库中的一行 table。

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,我可以找到 this page,看起来其他人遇到了同样的事情。看起来它是随机的,perl DBI 放置 <*> 符号。

我如何调整 perl DBI 才能正确地做出这个声明?

它不会将该符号插入查询中,而是执行。它只是错误消息中的一个标记,指示语法错误的位置,方便您更轻松地找到该位置。

要消除错误,请从查询中删除括号。

...
my $query = 'update THE_TABLE set COLUMN_ONE = ?, COLUMN_TWO = ?,
             MODIFY_DATE = SYSDATE where ID = ?';
...

perl DBI is adding a special <*> symbol group to the statement and that is causing the error

恐怕你完全错了。首先,添加符号的不是 Perl,而是 Oracle 查询编译器。其次,这些符号不会导致错误,它们会向您显示 Oracle 认为错误的位置。

仔细查看错误消息。它说:

DBD ERROR: error possibly near <*> indicator

"indicator" 一词就是您的线索。它已被添加到 "indicate" 错误它的地方。

如前所述,解决方案是从查询中删除不必要的括号。

精确度和准确度是成为专业程序员的重要部分。您需要习惯于阅读和理解错误消息 - 而不是只跳到想到的第一个可能的解释上。