Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Ошибка в запросе хранимой процедуры  [new]
PhantomSoft
Member

Откуда:
Сообщений: 2
При создании хранимой процедуры мускул ругается
У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около
'DECLARE aC CURSOR FOR SELECT id FROM fin_accounts WHERE owner=accOwner AN'
на строке 14

Помогите понять, где там ошибка зарыта?
BEGIN
DECLARE done, accOwnerId, accId INT DEFAULT 0;
DECLARE b, balance DECIMAL(10,2) DEFAULT 0.0;
DECLARE accOwner VARCHAR(50);
#Получаем владельца счёта
DECLARE oC CURSOR FOR
	SELECT `owner`, `owner_id` FROM fin_accounts WHERE `id`=accountId;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN oC;
FETCH oC INTO accOwner, accOwnerId;
CLOSE oC;
IF NOT done THEN
    #Получаем все расчётные счета владельца
	DECLARE aC CURSOR FOR
		SELECT `id` FROM  fin_accounts WHERE `owner`=accOwner AND `owner_id`=accOwnerId;
	OPEN aC;
	SET done = 0;
	WHILE NOT done DO
		FETCH aC INTO accId;
		IF NOT done THEN
        	#Считаем баланс по каждому расчётному счёту
			SELECT SUM(`sum`) INTO b FROM (
				SELECT 'i_src', -SUM(`amount`) AS `sum`
				FROM `fin_invoices`
				WHERE NOT `hidden` AND `acc_source`=accId
			UNION
				SELECT 'i_dst', SUM(`amount`) AS `sum`
				FROM `fin_invoices`
				WHERE NOT `hidden` AND `acc_dest`=accId
			UNION
				SELECT 'o_src', SUM(`amount`) AS `sum`
				FROM `fin_orders`
				WHERE `acc_source`=accId
			UNION
				SELECT 'o_dst', -SUM(`amount`) AS `sum`
				FROM `fin_orders`
				WHERE `acc_dest`=accId
			) a;
            #Вычисляем общий баланс по владельцу
			SET balance = balance + b;
		END if;
	END WHILE;
	CLOSE aC;
END IF;
SELECT balance;
END
5 ноя 20, 23:19    [22227231]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в запросе хранимой процедуры  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
DECLARE могут размещаться только в начале блока, до остальных команд. У Вас второй курсор определяется в середине блока.

BEGIN
DECLARE done, accOwnerId, accId INT DEFAULT 0;
DECLARE b, balance DECIMAL(10,2) DEFAULT 0.0;
DECLARE accOwner VARCHAR(50);
#Получаем владельца счёта
DECLARE oC CURSOR FOR
	SELECT `owner`, `owner_id` FROM fin_accounts WHERE `id`=accountId;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN oC;
FETCH oC INTO accOwner, accOwnerId;
CLOSE oC;
IF NOT done THEN
  BEGIN
    #Получаем все расчётные счета владельца
	DECLARE aC CURSOR FOR
		SELECT `id` FROM  fin_accounts WHERE `owner`=accOwner AND `owner_id`=accOwnerId;
	OPEN aC;
	SET done = 0;
	WHILE NOT done DO
		FETCH aC INTO accId;
		IF NOT done THEN
        	#Считаем баланс по каждому расчётному счёту
			SELECT SUM(`sum`) INTO b FROM (
				SELECT 'i_src', -SUM(`amount`) AS `sum`
				FROM `fin_invoices`
				WHERE NOT `hidden` AND `acc_source`=accId
			UNION
				SELECT 'i_dst', SUM(`amount`) AS `sum`
				FROM `fin_invoices`
				WHERE NOT `hidden` AND `acc_dest`=accId
			UNION
				SELECT 'o_src', SUM(`amount`) AS `sum`
				FROM `fin_orders`
				WHERE `acc_source`=accId
			UNION
				SELECT 'o_dst', -SUM(`amount`) AS `sum`
				FROM `fin_orders`
				WHERE `acc_dest`=accId
			) a;
            #Вычисляем общий баланс по владельцу
			SET balance = balance + b;
		END if;
	END WHILE;
	CLOSE aC;
  END;
END IF;
SELECT balance;
END
6 ноя 20, 07:42    [22227324]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в запросе хранимой процедуры  [new]
PhantomSoft
Member

Откуда:
Сообщений: 2
Akina, спасибо! Я всю ночь измучался, перебирая варианты.
Разрабы могли более информативно написать в тексте ошибки.
Теперь получается некий изврат: в запросе для второго курсора используются переменные, которые вычисляются после выборки данных из первого курсора.
6 ноя 20, 15:00    [22227555]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в запросе хранимой процедуры  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
PhantomSoft
Разрабы могли более информативно написать в тексте ошибки.
А что тут неинформативного? Чётко видно, что проблема с DECLARE. Причём это декларация курсора. А если прочитать справку по Cursor DECLARE Statement, достаточно короткую, кстати, так там чётко написано:
Cursor declarations must appear before handler declarations and after variable and condition declarations.
6 ноя 20, 15:19    [22227564]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить