Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка курсора 
:(
    Опции темы
YanaKass
Дата 29.4.2012, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.4.2012

Репутация: нет
Всего: нет



Добрый вечер!!

Только недавно начала знакомство с perl, и сейчас не могу разобраться с ошибкой. 
Написано следующее:
   
Код

$i=$dbh->prepare("select id_publ from authors");
$i->execute();

while (($id_publ)=$i->fetchrow_array){        
        $j = $dbh->prepare("select count(*) from status where id_publ=$id_publ");
        $j->execute();
        @row=$j->fetchrow_array;
        $all=$row[0];
        print "$all \n";
        $j->finish();
}
$i->finish();


Ошибка происходит во внутреннем execute(). Причем по отдельности оба курсора работают правильно. Помогите, пожалуйста

Это сообщение отредактировал(а) JackYF - 30.4.2012, 23:02
PM MAIL   Вверх
arto
Дата 29.4.2012, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



какая ошибка?
PM MAIL ICQ   Вверх
YanaKass
Дата 29.4.2012, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.4.2012

Репутация: нет
Всего: нет



InterBase::st finish failed: The cursor identified in a FETCH or CLOSE statement is not open


PM MAIL   Вверх
DurRandir
Дата 29.4.2012, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



a) use strict
б) finish() - не нужен
в) проверяйте результат работы любого вызова к базе
г) используйте плейсхолдеры, если запрос содержит переменные
PM   Вверх
YanaKass
Дата 29.4.2012, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.4.2012

Репутация: нет
Всего: нет



точно...


DurRandir, спасибо вам большое!!
Во-первых, за ваши советы, код теперь выглядит приличнее, а во-вторых, действительно, ошибка ломалась на случае, когда во втором запросе count(*)=0. 
Как-то и не думала, что на этом оно может сломаться...

Еще раз спасибо!
PM MAIL   Вверх
YanaKass
Дата 30.4.2012, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.4.2012

Репутация: нет
Всего: нет



Поменяла первый запрос, чтобы во втором гарантированно нашлись строки. Заодно еще немного подправила. Но теперь возникает такая же ошибка, опять во внутреннем execute, но уже на третьем проходе... То есть для первых двух результатов все хорошо. Проверила, запрос на третьем шаге данные возвращает. Вот так теперь выглядит код:

Код

my $s="select count(*) from status where id_publ=?";

while (($id_publ)=$publ->fetchrow_array){
               
        $all=$dbh->prepare($s);
        $all->execute($id_publ); 
        @row = $all->fetchrow_array;        
         print "$id_publ, $row[0]  \n";    
}
$publ->finish();



M
JackYF
Пользуйтесь кнопкой "код".

PM MAIL   Вверх
Pfailed
Дата 30.4.2012, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Код

$all=$dbh->prepare($s); 

нужно вынести за цикл
В этом и смысл prepare. Подготовили запрос 1 раз, а выполнили (execute) много.



--------------------
PM MAIL   Вверх
YanaKass
Дата 30.4.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.4.2012

Репутация: нет
Всего: нет



Pfailed, 
поэтому и внесла в цикл, что иначе возникает ошибка 
The InterBase::st execute failed: The cursor identified in a OPEN statement is alredy open
PM MAIL   Вверх
Pfailed
Дата 30.4.2012, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



потому что нужно делать finish перед следующим execute
что-то вроде этого
Код

my $all=$dbh->prepare("select count(*) from status where id_publ=?");

while (($id_publ)=$publ->fetchrow_array){
        $all->execute($id_publ); 
        @row = $all->fetchrow_array;
         $all->finish();
         print "$id_publ, $row[0]  \n";    
}
$publ->finish(); 



--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.