Я получаю эту ошибку от 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