Error 1172 mysql

Я получаю эту ошибку от MySQL при выполнении запроса внутри хранимой процедуры: ... Вопрос о: mysql, хранимых процедурах.

Я получаю эту ошибку от MySQL при выполнении запроса внутри хранимой процедуры:

Код ошибки: 1172 Результат состоял из более чем одной строки

Я понимаю ошибку: делаю SELECT (...) INTO (var list), поэтому запрос должен возвращать одну строку. Когда я использую LIMIT 1 or SELECT DISTINCT, ошибка исчезнет.

Однако: когда я запускаю исходный запрос вручную (без LIMIT or DISTINCT), он возвращает одну строку. Так что я подозреваю, что, возможно, наткнулся на ошибку MySQL. Кто-нибудь знает, что может происходить?

РЕДАКТИРОВАТЬ

Я отправляю SQL по запросу. Все, что начинается с подчеркивания, — это переменная, объявленная ранее внутри процедуры. Когда тестирую, заменяю _cd_pai_vc с идентификатором записи, вызывающей проблему.

SELECT  a.valor,    IFNULL(p.valor, 0), fn_cd2alias(ra.cd_registro),    fn_cd2alias(IFNULL(p.valor,0))
INTO    _valor,     _cd_pai_vc,         _alias_verbete,                 _alias_pai
FROM dados_registros ra
    INNER JOIN dados_varchar255 a
    ON a.cd_registro = ra.cd_registro
        AND a.fl_excluido = 0
        AND a.alias = 'vc-verbetes-termo'
    LEFT OUTER JOIN dados_registros rp
        INNER JOIN dados_int p
        ON p.cd_registro = rp.cd_registro
            AND p.fl_excluido = 0
            AND p.alias = 'vc-remissoes-termo referenciado'
        INNER JOIN dados_int pt
        ON pt.cd_registro = rp.cd_registro
            AND pt.fl_excluido = 0
            AND pt.alias = 'vc-remissoes-tipo remissao'
            AND fn_cd2alias(pt.valor) = 'hierarquica'
    ON ra.cd_registro = rp.cd_entidade
        AND rp.fl_excluido = 0
        AND fn_cd2alias(rp.cd_modulo) = 'vc-remissoes'
WHERE ra.cd_registro = _cd_pai_vc 
    AND ra.fl_excluido = 0;

Доброго времени суток, скидываю на ваш суд функцию:

DROP PROCEDURE IF EXISTS `set_auth3`;
DELIMITER $$
CREATE PROCEDURE `set_auth3` (IN usr_ip VARCHAR(15), IN auth_properties VARCHAR(255))
BEGIN
  DECLARE usr_id INT;
  DECLARE uid_ip VARCHAR(15);
  SELECT uid INTO usr_id FROM ip_pool WHERE INET_ATON(usr_ip) = ip LIMIT 1;
  SELECT ip INTO uid_ip FROM mac_uid WHERE ip = INET_ATON(usr_ip);

  IF( usr_id > 0 AND uid_ip = INET_ATON(usr_ip) ) THEN
    INSERT INTO auth_now SET
        ip = usr_ip,
        properties = auth_properties,
        start = UNIX_TIMESTAMP(),
        last = UNIX_TIMESTAMP()
    ON DUPLICATE KEY UPDATE
        properties = IF(auth_properties!=»,auth_properties,properties),
        last = UNIX_TIMESTAMP();

    UPDATE ip_pool SET `release` = UNIX_TIMESTAMP() + 90
        WHERE ip = INET_ATON(usr_ip)
          AND type = ‘dynamic’
          AND `release` < (UNIX_TIMESTAMP() + 65)
        LIMIT 1;
  END IF;
END$$
DELIMITER ;

Проблема заключается в том что если

SELECT ip INTO uid_ip FROM mac_uid WHERE ip = INET_ATON(usr_ip);

возвращает пустое значение, видим ошибку:

ERROR 1172 (42000): Result consisted of more than one row

Помогите исправить

Я бы сказал, что проблема здесь:

SELECT DISTINCTROW `cost` INTO ld_cost FROM `prod_itemcost` WHERE id = ls_id;

и вызвано тем, что возвращает более одной строки.
Как вы его решаете, это зависит от ваших требований. Существует ли существование нескольких строк, например, база данных нуждается в некоторой очистке? Или вы должны брать первое значение «стоимость» или, может быть, сумму всей «стоимости» для id = ls_id?

Изменить:

Ваше предложение INTO пытается записать несколько строк в одну переменную. Глядя на ваш SQL, я бы сказал, что основная проблема заключается в том, что ваш первоначальный запрос, чтобы отменить только самую последнюю стоимость для каждого идентификатора, усугубляется дубликатами pceffdate. Если это так, этот SQL:

SELECT DISTINCTROW `itemcode` ID, `mlist` COST
    FROM (SELECT `itemcode`, `pceffdate`, `mlist`
        FROM `purchcost` a
        where `pceffdate` = (SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode`
        AND z.`pceffdate` <= TDATE)) tb

вернет больше строк, чем только это:

SELECT DISTINCTROW `itemcode` ID
    FROM (SELECT `itemcode`, `pceffdate`, `mlist`
        FROM `purchcost` a
        where `pceffdate` = (SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode`
        AND z.`pceffdate` <= TDATE)) tb

Понравилась статья? Поделить с друзьями:
  • Error 1171 mysql
  • Error 117 partition s drive letter cannot be identified
  • Error 1168 element not found
  • Error 1166 nemesis
  • Error 1155 installshield