За последние 24 часа нас посетили 53908 программистов и 1715 роботов. Сейчас ищут 804 программиста ...

PDO вызов хранимой SQl процедуры

Тема в разделе "PHP и базы данных", создана пользователем derkien, 21 фев 2012.

  1. derkien

    derkien Активный пользователь

    С нами с:
    21 фев 2012
    Сообщения:
    7
    Симпатии:
    0
    Доброго времени суток.
    Проблем такая: В базе данных (firebird) хранится процедура, при вызове передаем ей некоторые параметры и на основании этих параметров она вносит записи в таблицу.

    Код (Text):
    1.  
    2. BEGIN
    3. i=0;
    4. N=0;
    5. open Cursor1;
    6. FETCH Cursor1 into :n;
    7. WHILE (i<n) DO
    8. BEGIN
    9. times3 = DATEADD(MINUTE,:INTERV1,:times2);
    10. times4 = DATEADD(MINUTE,:INTERV, :times1);
    11. update record set TIMES = :times2, TIMES_K = :times3 where ((TIMES = :times1) and (TIMES_K = :times4)) and (DATES = :DATESS) and (ID_DOCTOR = :IDD);
    12. times2 = times3;
    13. times1 = times4;
    14. i=i+1;
    15. END
    16. END
    При выполнении следующей команды в SQL редакторе IbExpert все работает нормально, вносится 20 записей
    Код (Text):
    1. execute procedure raspis_times ('09:30',20,5,20,'09.10.2011',2)

    При выполнении следующего кода в php записей выводится 40
    Код (Text):
    1. $sth = $db->prepare("execute procedure raspis_times ('09:30',20,5,20,'09.10.2011',2)");
    2. $sth->execute();
    При выполнении через query то же самое.

    Результат следующего кода- ошибка. "Call to a member function execute() on a non-object"
    Код (Text):
    1. $sth = $db->prepare("call raspis_times ('09:30',20,5,20,'09.10.2011',2)");
    2. $sth->execute();

    В общем как мне через pdo вызвать эту хранимую процедуру.
    По форуму уже искал, мануалы курил - не получается.

    т.е SQL код одинаковый, но через php записей получается вдвое больше. А через call вообще работать не хочет. И еще одно уточнение, если в Php скрипте за вызовом процедуры вписать следующий код например:

    Код (Text):
    1. $sth = $db->prepare("INSERT INTO RECORD (DATES,TIMES) VALUES ('09.10.2011','10:00:00')");        
    2. $sth->execute();
    то он выполнится как положено один раз - запись будет одна. Т.е. php скрипт два раза не вызывается, ошибка не в этом.
     
  2. derkien

    derkien Активный пользователь

    С нами с:
    21 фев 2012
    Сообщения:
    7
    Симпатии:
    0
    Хорошо, тогда напишите хотя бы правильно ли вызывать хранимую процедуру через execute? Во всех примерах что я видел - call. Но почему то call у меня не работает.
     
  3. derkien

    derkien Активный пользователь

    С нами с:
    21 фев 2012
    Сообщения:
    7
    Симпатии:
    0
    Все, уже не надо. Меня уже уволили из-за этой процедуры.
     
  4. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Сочувствую.
     
  5. derkien

    derkien Активный пользователь

    С нами с:
    21 фев 2012
    Сообщения:
    7
    Симпатии:
    0
    Да не, не надо(мне даже неловко стало) я пошутил. Но в каждой шутке есть доля шутки, как говориться. Неужели никто плотно не работал с вызовом процедур. Меня интересует именно вызов хранимой SQL процедуры для сферической базы данных в вакууме через объект PDO
     
  6. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Interbase?
    может таки не использовать "execute procedure raspis_times" для prepare, а просто и банально "execute raspis_times" ?
    близкая тема viewtopic.php?t=23526
     
  7. derkien

    derkien Активный пользователь

    С нами с:
    21 фев 2012
    Сообщения:
    7
    Симпатии:
    0
    Оу. AndreJM, спасибо за ссылку Думаю так получится.
     
  8. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Я в синтаксисе IB не силен, поэтому чем смог - тем помог =)
     
  9. derkien

    derkien Активный пользователь

    С нами с:
    21 фев 2012
    Сообщения:
    7
    Симпатии:
    0
    Актуальная информация: процедура выполняется два раза при вызове лишь через PDO объект.
    Переписал без PDO, с ibase_* функциями: все работает как часы.
    Хотелось бы все таки использовать PDO и параллельно выяснить по какой причине происходит такой финт ушами.
    Может в свете новых данных у кого-нибудь появятся соображения.