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 的解决办法
使用Ora2Pg工具把数据从Oracle导入到PostgreSQL