Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > Вызов MYSQL процедуры из программы на C++


Автор: Zerstroer 9.11.2009, 20:20
Здравствуйте, уважаемые...
Возникла крайне критичная ошибка. 
Задача: из программы написанной на C++ (под Linux) вызвать хранимую MySQL (Использую MySQL 5.1) процедуру.
Процедура следующая:
Код

DROP PROCEDURE IF EXISTS myprocesskiller2; -
DELIMITER $$
CREATE PROCEDURE myprocesskiller2 ()
  BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE idi INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR SELECT id FROM missileids;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    CREATE TEMPORARY TABLE IF NOT EXISTS missileids SELECT ID from get_missile_id_view;
    OPEN cur1;
    REPEAT
      FETCH cur1 INTO idi;
      set @mslid = null;
      set @mslid = idi;
      set @killstr = concat("kill ", @mslid);
      prepare killproc from @killstr;
      if exists (select id from get_missile_id_view where id = @mslid) then
        execute killproc;
      end if;
      set @killstr = null;
    UNTIL done END REPEAT;
    CLOSE cur1;
    DROP TABLE missileids;
  END$$
DELIMITER ; 

Что она делает: Представление get_missile_id_view возвращает перечень idшников сессий на данном MySQL сервере выбранных по определенному принципу. Дальше, как вы уже могли разобраться по коду - процедура выполняет kill id, то есть грохает последовательно все сессии. 
Процедура при вызове ее из mysql консоли (call myprocesskiller2) работает корректно. Убивает все необходимые сессии.
Далее вызываю ее из программы, вот функция C++:
Код

void killWM2(){
    MYSQL kmysql;
    int z = getNumRows();//количество сессий к базе данных
    cout << "---->" << z << endl;
    if (z>10) {
        if(!mysql_init(&kmysql))
            cout << "can't init DB" << endl;
        if (!mysql_real_connect(&kmysql, "localhost", "root", "123", "mydb", 0, NULL, 0))
            cout << "can't connect DB" << endl;

        char* killquery = "call mydb.myprocesskiller2;";
        if (mysql_real_query(&kmysql, killquery, 29))
            cout << "success" << killquery << endl; else
                cout << "error:(" << endl;
        mysql_real_query(&kmysql, "exit;", 5);
        mysql_close(&kmysql);
    }
}

И вот отсюда, я как ни бьюсь ее я вызвать не могу. Прошу помочь. Помогите отследить и исправить ошибку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)