Сбой запроса выбора хранимой процедуры MySQL

0
DELIMITER $$

USE 'temp' $$

DROP PROCEDURE IF EXISTS 'GenerateUniqueValue'$$

CREATE PROCEDURE 'GenerateUniqueValue'(IN tableName VARCHAR(255),IN columnName VARCHAR(255)) 
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  ',tableName,' WHERE ',columnName,'  like ''',newUniqueValue,'''');
        PREPARE stmt FROM  @query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    IF @rcount = 0 THEN
            SET uniqueValue = @newUniqueValue ;
        END IF ;
    END WHILE ;
    SELECT uniqueValue;
    END$$

DELIMITER ;

Я написал эту процедуру для получения уникального значения в таблице. В случайное время возвращается дублирующее значение. Запрос select не возвращает результатов для существующих критериев. Не знаю, где я скучаю

  • 0
    Вы, кажется, ничего не вставляете в эту таблицу. Вы уверены, что предыдущие значения действительно есть? Также SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1) . Длина строки составляет 35 символов, поэтому она должна быть RAND()*35 . Кроме того, MySQL округляет значения с дробной частью 0,5 или более, поэтому, если вы хотите выбрать каждый символ с равной вероятностью, попробуйте SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*35+0.5, 1) . (Или используйте FLOOR() , что сделает ваш код более понятным.)
  • 0
    Я вызываю эту процедуру перед каждой вставкой. Поток, получая уникальное значение, вставляет его в таблицу. Я проверил следующий код: String query = "CALL GenerateUniqueValue ('test', 'UniqueValue')"; for (int i = 0; i <50000; i ++) {rs = stmt.executeQuery (query); if (rs.next ()) {stmt1.executeUpdate ("INSERT INTO test VALUES ('" + gsin + "')"); System.out.println (I + ":" + ГСИН); }}
Теги:
stored-procedures
random
unique

1 ответ

-1

DELIMITER $$
USE 'temp' $$
DROP PROCEDURE IF EXISTS 'GenerateUniqueValue'$$

CREATE PROCEDURE 'GenerateUniqueValue'(IN tableName VARCHAR(255),IN columnName VARCHAR(255))
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  ',tableName,' WHERE ',columnName,'  like ''',@newUniqueValue,'''');
        PREPARE stmt FROM  @query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    IF @rcount = 0 THEN
            SET @query=CONCAT('insert into  ',tableName,' ( ',columnName,' ) values (''',@newUniqueValue,''')');
            PREPARE stmt FROM  @query;
         EXECUTE stmt;
         DEALLOCATE PREPARE stmt;
            SET uniqueValue = @newUniqueValue ;
        END IF ;
    END WHILE ;
SELECT @query;
    END
  • 0
    какая-то конкретная причина для понижения?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню