Хранимые процедуры

PeRsoNalIty
Дата: 05.02.2013 19:56:56
Добрый вечер.
Какой день сижу с хранимыми процедурами, инфы почему-то в интернете по ним мало.
Пытаюсь перевести из Microsoft SQL в mysql. Уже намучился. Прошу посмотреть что у меня получилось и указать на ошибки.
Логика следующая в процедуру передается слово дальше начинается его разбор по частям и поиска в таблицах его основы, окончания. Сразу скажу, прохожу студенческую производственную практику и такое задание.
Сам уже как не пробовал, уже и php ошибки не выводит($mysqli->errno) но все равно не выполняется.
Такое ощущение, что проблема с обрезкой слова и приставания значений переменным в селекте, так как когда их убираешь начинает работать, а с обрезкой если сразу присвоить значение то тоже срабатывает, но как не переделывал все равно не получается.
Еще вопрос как можно выводить отладочную информацию к примеру что находится в данной переменной?
Заранее благодарен.
Саму процедуру в php реализую вот так:
+
if (!$mysqli->query("DROP PROCEDURE IF EXISTS Find_Form") ||
    !$mysqli->query('
CREATE PROCEDURE Find_Form(IN Param1 Nvarchar(50)) READS SQL DATA BEGIN
      	DECLARE Lemma1 Nvarchar(50);
    DECLARE Okon1 Nvarchar(50);
    DECLARE Osnov Nvarchar(50);
    DECLARE SOsnov Nvarchar(50);
    DECLARE i1, forma1, Kod_MPosl, ROWCOUNT1 int;
    DECLARE DublPARAM1 NVarchar(50);
    DECLARE WG1 nvarchar(3);
    
    SET DublParam1=RTRIM(Param1);
    SET i1=1;
    
    
    WHILE i1<=LENGTH(DublParam1) Do
       SET Lemma1=SUBSTRING(DublParam1,0,i1);
       SET Okon1="";
       SET Osnov="";
       SET SOsnov="";
       SET Okon1=RTRIM(SUBSTRING(DublParam1,i1,100));
       SET forma1=0;
       SET WG1="";
       SET ROWCOUNT1=0;
       IF Okon1 != ""  THEN 
               SET Kod_MPosl=0;              
               SELECT c.forma, WG, Dict_Form, SDICT_FORM, count(SDICT_FORM) INTO forma1,WG1,Osnov,SOsnov,ROWCOUNT1 FROM T_BASE c 
                    WHERE c.SDICT_FORM=Lemma1 AND KolWord=1;
               
              IF ROWCOUNT1!= 0  THEN 
                  IF ROWCOUNT1=1 THEN 
                    IF Forma1 != 0 AND EXISTS(SELECT * FROM T_okon b WHERE okon=Okon1 AND b.forma = forma1 AND instr(WG1,b.WG)>0) THEN 
                      SELECT Lemma1+Okon1 as Slovoforma,Comm as Hint, Lemma1+M_Rule as Morf_Anal, WG1 as WG FROM M_Posled_1 a 
                          WHERE a.Kod_MPosl IN
                            (SELECT b.Kod_M_Posl FROM T_okon b
                               WHERE okon=Okon1 AND b.forma = forma1 AND instr(WG1,b.WG)>0) ;
                      END IF;
                   ELSE  
                     IF EXISTS(SELECT * FROM T_okon b WHERE okon=Okon1) THEN 
                       SELECT Lemma1+Okon1 as Slovoforma,Comm as Hint, Lemma1+M_Rule, M_1 as WG FROM M_Posled_1 a
                         WHERE a.Kod_MPosl IN
                           (SELECT b.Kod_M_Posl FROM T_okon b
                              WHERE okon=Okon1 AND 
                                    b.forma IN (SELECT c.forma FROM T_Base c
                                           WHERE c.SDICT_FORM=Lemma1 AND KolWord=1 )) ;
		      END IF;			   
                   END IF;                        
              END IF;                                         
          ELSE
            IF EXISTS(SELECT * FROM T_BASE c WHERE c.SDICT_FORM=Lemma1 AND KolWord=1) THEN
              SELECT Lemma1,N"основа",WG1 as WG;
			END IF;  
	  END IF;
              SET i1=i1+1;
 END WHILE; 
     END;
')) {
    echo "Не удалось создать хранимую процедуру: (" . $mysqli->errno . ") " . $mysqli->error;
}
вадя
Дата: 05.02.2013 20:32:28
установи dbForge Studio for MySQL
и там произведи отладку, трасировку
Akina
Дата: 05.02.2013 21:00:00
Я не понял... процедура-то MS SQL-ная... где сам текст ПЕРЕВЕДЁННОЙ на диалект MySQL процедуры?
PeRsoNalIty
Дата: 05.02.2013 21:02:26
Akina
Я не понял... процедура-то MS SQL-ная... где сам текст ПЕРЕВЕДЁННОЙ на диалект MySQL процедуры?

Это и есть на MySQL.
PeRsoNalIty
Дата: 05.02.2013 21:03:29
вадя
установи dbForge Studio for MySQL
и там произведи отладку, трасировку

Можете подсказать как можно посмотреть значение переменной при отладке, сначала выводилось при наведении на нее сейчас никак не выводится.
DBConstructor
Дата: 05.02.2013 21:11:24
PeRsoNalIty, не забудьте один важный момент - переопределение разделителей конструкций с помощью delimiter

[sql]delimiter //
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t;
END//
delimiter ;
[/sql]

пример взят отсюда: http://dev.mysql.com/doc/refman/5.5/en/create-procedure.html

необходимо наличие <br> после delimiter
miksoft
Дата: 05.02.2013 21:13:36
DBConstructor
необходимо наличие <br> после delimiter
Может, не <br> а переноса строки?
PeRsoNalIty
Дата: 05.02.2013 22:33:48
Появился такой вопрос, больше по PHP. У меня почему-то выводит только результат последнего SELECT при чем в результате он столько раз сколько выполняется while хотя по отладке в этот селект выполняется всего один раз и в самом конце.

Вывожу так:
do {
    if ($res = $mysqli->store_result()) {
        printf("---\n");
        var_dump($res->fetch_all());
        $res->free();
    } else {
        if ($mysqli->errno) {
            echo "Не удалось получить результат на клиенте: (" . $mysqli->errno . ") " . $mysqli->error;
        }
    }
} while ($mysqli->more_results() && $mysqli->next_result());

Как сделать чтобы в конечно результате были все выполнявшиеся селекты? Что-то кажется дело в самой процедуре.
Akina
Дата: 05.02.2013 22:42:54
PeRsoNalIty
Как сделать чтобы в конечно результате были все выполнявшиеся селекты?
Делать не селекты, а вставку в темп-таблицу. А в конце процедуры - один селект из неё в выходной поток.
Akina
Дата: 05.02.2013 22:43:04
PeRsoNalIty
Akina
Я не понял... процедура-то MS SQL-ная... где сам текст ПЕРЕВЕДЁННОЙ на диалект MySQL процедуры?

Это и есть на MySQL.

Виноват, был невнимателен.