perl 中的 DBD::Oracle 和 DBI 错误

Posted

技术标签:

【中文标题】perl 中的 DBD::Oracle 和 DBI 错误【英文标题】:DBD::Oracle and DBI error in perl 【发布时间】:2011-08-23 18:18:45 【问题描述】:

我在这里遇到了一个关于 perl 和 DBI 模块的奇怪问题。有时我可以成功获取查询,但有时,当我添加一行与数据库访问或类似的远程相关的代码时,我收到一条错误消息:

DBD::Oracle::st fetchrow_array failed: ERROR no statement execution (也许你需要先调用 execute) [for Statement "select * from (...)"] at script.pl 第 18 行。

我使用 sqlplus 验证我的选择命令在这里没有问题(当然,这就是我说脚本有时工作的原因!)

如果我在 perl 脚本中的 select 命令后添加分号,我会收到另一个错误提示:

DBD::Oracle::db 准备失败:ORA-00911:无效字符(DBD 错误:'select * from (...);' 中字符 970 处的 指示符附近可能有错误)[ for Statement "select * from (...);"] at script.pl 第 13 行。

谁能告诉我这里发生了什么?是不是因为 sql 命令太长(~900 个字符)?

【问题讨论】:

您可能应该向我们展示脚本 - 或者它的前 20 行左右。很有可能您在循环中所做的某些事情会干扰您的陈述。你读过文档吗?看perldoc DBD::Oracle或DBD::Oracle;还有perldoc DBI 或DBI。一些驱动程序对同时激活两个语句句柄或类似规则有奇怪的限制。 【参考方案1】:

这个错误意味着你已经准备了一个语句但没有执行它。如果您准备了一个语句,执行它并获取所有行然后再次调用 fetch,您也可能会得到它,但我对此不太确定。在这种情况下,不要在 SQL 的末尾加上分号,因为这不是必需的。

执行的属性见https://metacpan.org/pod/DBI#Executed。

【讨论】:

感谢您的回复。我在prepare() 之后确实有execute(),并且只使用了一次fetchrow_array。我现在知道我不应该在我的 SQL 末尾加上分号。但我仍然收到奇怪的错误。 "在这种情况下,不要在 SQL 末尾添加分号,因为它不需要。" - 这更像是不正确而不是不需要,我的问题原来是这样。【参考方案2】:

我遇到了同样的问题,我注意到我在 fetch 之后有一个 fetchrow_array,这就是问题所在。

while ($sth->fetch) 

  sth->fetchrow_array;
  $myvar = some logic here
  $myvar2 = some other logic here


我删除了 sth->fetchrow_array;现在一切正常:)

【讨论】:

以上是关于perl 中的 DBD::Oracle 和 DBI 错误的主要内容,如果未能解决你的问题,请参考以下文章

linux centos环境下,perl使用DBD::Oracle遇到报错Can't locate DBDOracle.pm in @INC 的解决办法

DBD::Oracle 安装导致错误

使用Ora2Pg工具把数据从Oracle导入到PostgreSQL

有没有办法使用 DBI 和 MySQL/MyISAM 将 @variables 与 Perl 中的占位符混合?

如何正确表示 Perl 的 DBI 中的空格

如何检查 Perl 中的 DBI 查询是不是返回了多个记录?