SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.01.2023 02:08:41

Zagin
Участник
Зарегистрирован: 08.01.2023
Сообщений: 2

Можно ли вызывать ХП в предложении UPDATE?

Прошу помощи в обновлении поля таблицы значением из хранимой процедуры.
В текущей базе (MariaDB) имеется таблица table1, в которой имеется 8-символьное поле id типа Char. Также в этой же базе имеется хранимая процедура GenUniKey(), генерирующая 8-символьное случайное значение и запоминающая его в отдельной таблице b22_tblKeys.
Эта процедура прекрасно работает при вызове через PHP. А можно ли как-нибудь вызвать эту процедуру внутри предложения UPDATE SQL чтобы заменить значения поля table1.id во всех записях?
Я пробовал вот так:

UPDATE `table1` SET `id`=(CALL `GenUniKey()`) WHERE 1

- не срабатывает, ругается на синтаксис (#1064)
На всякий случай привожу здесь текст самой процедуры GenUniKey(), заимствованной мной из Интернета:
BEGIN
    DECLARE uniqueValue VARCHAR(8) DEFAULT "";
    DECLARE newUniqueValue VARCHAR(8) DEFAULT "";
    WHILE LENGTH(uniqueValue) = 0 DO
        SELECT CONCAT(SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1)
                ) INTO @newUniqueValue;
        SET @rcount = -1;
        SET @query=CONCAT('SELECT COUNT(*) INTO @rcount FROM `b22_tblKeys` WHERE `idKey`  like "',newUniqueValue,'"');
        PREPARE stmt FROM  @query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    IF @rcount = 0 THEN
            SET uniqueValue = @newUniqueValue ;
        END IF ;
    END WHILE ;
    INSERT INTO `b22_tblKeys` (idKey) VALUES (uniqueValue);
    SELECT uniqueValue;
    END

Неактивен

 

#2 08.01.2023 09:57:15

estic
Завсегдатай
Зарегистрирован: 01.10.2022
Сообщений: 25

Re: Можно ли вызывать ХП в предложении UPDATE?

Zagin написал:

А можно ли как-нибудь вызвать эту процедуру внутри предложения UPDATE

Триггер.

Обычно подобные уникальные ключи - не "рандомные", а просто идентификаторы, переведенные в систему счисления с основанием 32 или 64 (с учетом полной разрядности идентификатора, так что длина ключей всегда одинаковая, по крайней мере пока вы не исчерпаете текущую разрядность).

Неактивен

 

#3 08.01.2023 10:05:08

estic
Завсегдатай
Зарегистрирован: 01.10.2022
Сообщений: 25

Re: Можно ли вызывать ХП в предложении UPDATE?

Также можно динамически переводить из одной системы счисления в другую, без кэширования подобных символьных идентификаторов в базе данных.

Неактивен

 

#4 08.01.2023 17:19:10

Zagin
Участник
Зарегистрирован: 08.01.2023
Сообщений: 2

Re: Можно ли вызывать ХП в предложении UPDATE?

To estic:
Спасибо за подсказку о триггерах - не использовал их, но имею поверхностное представление и читал теорию.
В самом вопросе меня больше интересовал СПОСОБ внедрения (приклеивания, вписывания) тех 8-символьных ключей в поле id каждой записи, а не преобразования самих ключей. Я даже подумал о цикле по записям, но не нашёл в MySQL ничего подходящего для моего случая - как обратиться внутри цикла к ОЧЕРЕДНОЙ записи, чтобы присвоить ей ОЧЕРЕДНОЕ значение, сгенерированное хранимой процедурой. Попробую поупражняться с триггером обновления.
Если и в таком способе мне не хватит знаний и смекалки для успеха - что ж, всегда есть способ "лома": например, можно выгрузить все нужные данные в dbf-таблицу, "вшить" в них ключи в цикле FoxPro (он хоть и почти мёртвый, но подобные процессы в нём реализуются элементарно) и потом загрузить уже обновлённые данные на свои места в таблицах MySQL.
В любом случае - спасибо за подсказку о триггерах.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson