powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка в запросе хранимой процедуры
4 сообщений из 4, страница 1 из 1
Ошибка в запросе хранимой процедуры
    #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
Ошибка в запросе хранимой процедуры
    #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
Ошибка в запросе хранимой процедуры
    #40015973
PhantomSoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, спасибо! Я всю ночь измучался, перебирая варианты.
Разрабы могли более информативно написать в тексте ошибки.
Теперь получается некий изврат: в запросе для второго курсора используются переменные, которые вычисляются после выборки данных из первого курсора.
...
Рейтинг: 0 / 0
Ошибка в запросе хранимой процедуры
    #40015980
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PhantomSoft
Разрабы могли более информативно написать в тексте ошибки.
А что тут неинформативного? Чётко видно, что проблема с DECLARE. Причём это декларация курсора. А если прочитать справку по Cursor DECLARE Statement , достаточно короткую, кстати, так там чётко написано:
Cursor declarations must appear before handler declarations and after variable and condition declarations.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ошибка в запросе хранимой процедуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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