Хранимая процедура MySQL не дает результатов - PullRequest
1 голос
/ 27 февраля 2012
mysql> select * from S_TABLE;
+--------+--------------------+
|   S_ID | S_TITLE            |
+--------+--------------------+
|      1 |  Jim               |
|      2 |  George            |
|      3 |  Sam               |
|      4 |  Zoe               |
+--------+--------------------+

mysql> select * from F_TABLE;
+--------+--------+--------------+----------+
| F_ID   |  S_ID  | F_VALUE      | F_TITLE  |
+--------+--------+--------------+----------+
|      1 |      1 | 4.5          | Delta    |
|      2 |      2 | 24.5         | Gamma    |
|      3 |      3 | 44.4         | RHO      |
|      4 |      3 | 5.0          | Beta     |
+--------+--------+--------------+----------+

mysql> select * from Results; // Hence this table is empty
+--------+-------------+
| Fstuff | Sstuff      |
+--------+-------------+
|        |             |
+--------+-------------+

This stored procedure does a frivolous computation

DELIMITER ##
CREATE PROCEDURE zap(IN sss VARCHAR(30))
BEGIN 

INSERT INTO Results (fstuff, Sstuff)
Select 
f.F_VALUE * 0 + 123,
s.S_TITLE
FROM F_TABLE f
JOIN S_TABLE s ON s.S_ID=f.S_ID
WHERE s.S_TITLE LIKE CONCAT('%', sss, '%');

END ##
DELIMITER ;

This stored procedure calls zap

DELIMITER ##
CREATE PROCEDURE crap()
BEGIN
    DECLARE fTit VARCHAR(30);
    DECLARE done INT DEFAULT 0;
    DECLARE cur CURSOR FOR SELECT F_TITLE FROM F_TABLE;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur;
    read_loop: LOOP

        FETCH cur INTO fTit;

        IF done 
            THEN LEAVE read_loop;
        END IF;

        call Zap(fTit);
        COMMIT;

    END LOOP;
    CLOSE cur;

END ##
DELIMITER ;

Проблема: таблица результатов становитсянеобработанный?Я не могу понять, почему

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

Я не могу обнаружить никаких синтаксических ошибок в логике процедур.

Но это условие:

WHERE s.S_TITLE LIKE CONCAT('%', sss, '%')

представляется ложным для всех комбинаций двух примеров таблиц (sss получает значения из столбца F_TABLE.F_TITLE).Это означает, что строки не будут вставлены.

1 голос
/ 27 февраля 2012

Вы считываете имена из F_TABLE.F_TITLE (Delta, Gamma ...) и ищете их в S_TABLE.S_TITLE, и совпадения нет.

Курсор в crap должен использовать то же самоестолбец заголовка как процедура zap.

edit:

Курсор cur CURSOR FOR SELECT F_TITLE FROM F_TABLE; извлечет 'Delta', 'Gamma' и т. д. в fTit.Затем вызывается Zap(): Zap('Delta'), Zap('Gamma') и т. Д.

Процедура Zap создаст строку соответствия '%Delta%', '%Gamma%' и т. Д. И будет искать это в первой таблице.Вы в списке.Поскольку эта таблица содержит «Джим», «Джордж» и другие имена, совпадений нет.SELECT не возвращает строк, поэтому в любом из вызовов zap ничего не вставляется.

Если вы измените курсор на вместо просмотра S_TABLE, вы получите вставленные строки, но, возможно, нете, которые вы хотите.Пожалуйста, объясните больше, что вы ожидаете в таблице результатов.

0 голосов
/ 27 февраля 2012

Установлен автокоммит или, возможно, вам нужно COMMIT, в конце crap.

...