MySql Хранимая процедура .... ошибка в group_concat - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть следующий запрос, который работает в phpMyAdmin

SELECT CONCAT("'",GROUP_CONCAT( fence_id SEPARATOR "','" ),"'") AS fence_ids 
FROM asset_fence af 
INNER JOIN assets a ON a.vehicle_id = af.vehicle_id 
WHERE a.client_id=1

Но тот же запрос дает мне ошибку в хранимой процедуре

ОШИБКА IS:

У вас естьошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с '@fence_ids = SELECT CONCAT ("'", GROUP_CONCAT (fence_id SEPARATOR "','"), "'") AS "в строке 8 * 1009.*

ХРАНЯЩАЯСЯ ПРОЦЕДУРА IS

DELIMITER $$

CREATE PROCEDURE `prcDeleteClient`(IN `f_client_id` INT, OUT AROWS INT)
BEGIN


    START TRANSACTION;


        @fence_ids = SELECT CONCAT("'",GROUP_CONCAT( fence_id SEPARATOR "','" ),"'") AS fence_ids FROM asset_fence af INNER JOIN assets a ON a.vehicle_id = af.vehicle_id WHERE a.client_id=f_client_id


        DELETE
            asset_fence,
            geo_fence

        FROM 
            geo_fence gf INNER JOIN asset_fence af ON gf.fence_id = af.fence_id

        WHERE
            af.fence_id IN (@fence_ids)



        DELETE
            client,
            assets,
            asset_movement

        FROM 
            asset_movement am INNER JOIN assets a ON am.vehicle_id = a.vehicle_id
            assets a INNER JOIN client c ON a.client_id = c.client_id

        WHERE
            c.client_id=f_client_id


        SET @AROWS = ROW_COUNT();
        SELECT @AROWS as AROWS;

    COMMIT;
END $$

DELIMITER ;

Обновлена ​​процедура

DELIMITER $$

CREATE PROCEDURE `prcDeleteClient`(IN `f_client_id` INT, OUT AROWS INT)
BEGIN


    START TRANSACTION;


        DELETE
            af,
            gf
        FROM 
            geo_fence gf

            INNER JOIN asset_fence af ON gf.fence_id = af.fence_id
            INNER JOIN assets a ON a.vehicle_id = af.vehicle_id

        WHERE
            a.client_id=f_client_id;



        DELETE
            c,
            a,
            am

        FROM 
            asset_movement am INNER JOIN assets a ON am.vehicle_id = a.vehicle_id
            assets a INNER JOIN clients c ON a.client_id = c.client_id

        WHERE
            c.client_id=f_client_id;


        SELECT ROW_COUNT() AS AROWS;

    COMMIT;
END $$

DELIMITER ;

Ошибка: Неизвестная таблица 'c' в MULTI DELETE

Что такоеошибка и как я могу ее исправить?

С наилучшими пожеланиями

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Во-первых, ваш синтаксис для назначения переменных неверен, ему нужна команда SET перед именем переменной.

Во-вторых, если вы хотите использовать результат запроса SELECT в качестве значения,Вы должны заключить в скобки:

SET @fence_ids = (SELECT ...);

В-третьих, когда вы используете:

WHERE af.fence_id IN (@fence_ids)

, он будет обрабатывать @fence_ids как один идентификатор, а не список идентификаторов.Так что это эквивалентно:

WHERE af.fence_id = @fence_ids

Если вы хотите найти что-то в списке через запятую, вам нужно использовать FIND_IN_SET:

WHERE FIND_IN_SET(af.fence_id, @fence_ids)

Вы также не должны 'Не добавляйте кавычки вокруг значений в вашем GROUP_CONCAT().

Но вы не должны использовать GROUP_CONCAT для этого, вам нужно просто присоединиться к запросу, который возвращает все нужные вам идентификаторы.

   DELETE
        af,
        gf
    FROM 
        geo_fence gf 
    INNER JOIN asset_fence af ON gf.fence_id = af.fence_id
    INNER JOIN assets a ON a.vehicle_id = af.vehicle_id 
    WHERE a.client_id=f_client_id;

Вам не нужно делать это в двух утверждениях:

SET @AROWS = ROW_COUNT();
SELECT @AROWS as AROWS;

Вы можете просто сделать:

SELECT ROW_COUNT() AS AROWS;
0 голосов
/ 14 февраля 2019

Вы устанавливаете значение так, что вам не нужен псевдоним столбца ... удалите AS fence_ids

    SELECT CONCAT("'", GROUP_CONCAT( af.fence_id SEPARATOR "','" ),"'") 
    FROM asset_fence af 
    INNER JOIN assets a ON a.vehicle_id = af.vehicle_id
    WHERE a.client_id=1

, и вы пропустили также терминатор команды для каждого удаления

   DELETE
        asset_fence,
        geo_fence

    FROM 
        geo_fence gf INNER JOIN asset_fence af ON gf.fence_id = af.fence_id

    WHERE
        af.fence_id IN (@fence_ids);



    DELETE
        client,
        assets,
        asset_movement

    FROM 
        asset_movement am INNER JOIN assets a ON am.vehicle_id = a.vehicle_id
        assets a INNER JOIN client c ON a.client_id = c.client_id

    WHERE
        c.client_id=f_client_id;
...