Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка в запросе хранимой процедуры / 4 сообщений из 4, страница 1 из 1
05.11.2020, 23:19
    #40015763
PhantomSoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в запросе хранимой процедуры
При создании хранимой процедуры мускул ругается
Код: plsql
1.
2.
3.
У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около
'DECLARE aC CURSOR FOR SELECT id FROM fin_accounts WHERE owner=accOwner AN'
на строке 14


Помогите понять, где там ошибка зарыта?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
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
...
Рейтинг: 0 / 0
06.11.2020, 07:42
    #40015830
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в запросе хранимой процедуры
DECLARE могут размещаться только в начале блока, до остальных команд. У Вас второй курсор определяется в середине блока.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
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
...
Рейтинг: 0 / 0
06.11.2020, 15:00
    #40015973
PhantomSoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в запросе хранимой процедуры
Akina, спасибо! Я всю ночь измучался, перебирая варианты.
Разрабы могли более информативно написать в тексте ошибки.
Теперь получается некий изврат: в запросе для второго курсора используются переменные, которые вычисляются после выборки данных из первого курсора.
...
Рейтинг: 0 / 0
06.11.2020, 15:19
    #40015980
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в запросе хранимой процедуры
PhantomSoft
Разрабы могли более информативно написать в тексте ошибки.
А что тут неинформативного? Чётко видно, что проблема с DECLARE. Причём это декларация курсора. А если прочитать справку по Cursor DECLARE Statement , достаточно короткую, кстати, так там чётко написано:
Cursor declarations must appear before handler declarations and after variable and condition declarations.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка в запросе хранимой процедуры / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]