DBD :: Oracle и ошибка DBI в perl

У меня странная проблема с модулем perl и DBI. Иногда я могу успешно получить запрос, но иногда, когда я добавляю строку кода, которая удаленно связана с доступом к базе данных или чем-то в этом роде, я получаю сообщение об ошибке:

DBD :: Oracle :: st fetchrow_array failed: ERROR не выполняется инструкция (возможно, вам нужно сначала вызвать execute) [для инструкции «select * from (...)»] в строке 18 script.pl.

Я проверил с помощью sqlplus, что у моей команды select здесь нет проблем (конечно, поэтому я сказал, что скрипт иногда работает!)

Если я добавил точку с запятой после команды select в скрипте perl, я получил еще одну ошибку:

Ошибка подготовки DBD :: Oracle :: db: ORA-00911: недопустимый символ (ОШИБКА DBD: ошибка, возможно, рядом с индикатором ‹*> в char 970 в 'select * from (...)‹ *>;') [для утверждения » select * from (...); "] в строке 13 script.pl.

Может ли кто-нибудь подсказать мне, что здесь происходит? Это потому, что команда sql слишком длинная (~ 900 символов)?


person Qiang Li    schedule 12.05.2011    source источник
comment
Вы, вероятно, должны показать нам сценарий - или первые 20 или около того его строк. Скорее всего, что-то, что вы делаете в цикле, мешает вашему утверждению. Вы читали документацию? Посмотрите на perldoc DBD::Oracle или DBD :: Oracle; также perldoc DBI или DBI. Некоторые драйверы имеют странные ограничения на одновременную активацию двух дескрипторов операторов или аналогичные правила.   -  person Jonathan Leffler    schedule 12.05.2011


Ответы (2)


Эта ошибка означает, что вы подготовили оператор, но не выполнили его. Вы также можете получить его, если подготовили оператор, выполнили его и извлекли все строки, а затем снова вызовите fetch, но я менее уверен в этом. В этом случае не ставьте точку с запятой в конце вашего SQL, поскольку это не требуется.

См. https://metacpan.org/pod/DBI#Executed для исполняемого атрибута.

person bohica    schedule 12.05.2011
comment
Спасибо за ответ. У меня есть execute() после prepare(), и я использовал fetchrow_array только один раз. Теперь я знаю, что не следует ставить точку с запятой в конце моего SQL. Но я все еще получаю странную ошибку. - person Qiang Li; 12.05.2011
comment
В этом случае не ставьте точку с запятой в конце вашего SQL, поскольку это не требуется. - это было больше похоже на неверно, а не "необязательно", моя проблема оказалась именно в этом. - person mavili; 17.05.2016

У меня была такая же проблема, и я заметил, что после выборки у меня был fetchrow_array, это была проблема.

while ($sth->fetch) {

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

}

Я удалил sth-> fetchrow_array; и теперь все работает :)

person israelss    schedule 21.03.2014