powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Остановка курсива при пустой выборке
7 сообщений из 7, страница 1 из 1
Остановка курсива при пустой выборке
    #39542225
chiffacff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Есть процедура, которая в курсиве выбирает id-записей. Далее

происходит доп. выборка:

Код: plsql
1.
2.
3.
4.
5.
........
FETCH cur1 INTO UserIdGet
.......
 SELECT balance INTO BalanceGet FROM acc WHERE user_id = UserIdGet;
.......



если в таблице acc не находит запись - происходит выход из курсива....

Не хотелось бы предварительно ставить еще один запрос на проверку наличия юзера в таблице асс...
Подскажет, как правильнее решить данную задачу? Заранее спасибо за помощь!
...
Рейтинг: 0 / 0
Остановка курсива при пустой выборке
    #39542261
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chiffacffкак правильнее решить данную задачу?
Код: sql
1.
DECLARE CONTINUE HANDLER FOR NOT FOUND BEGIN END;


PS. "Курсив" на самом деле называется "курсор".
...
Рейтинг: 0 / 0
Остановка курсива при пустой выборке
    #39542265
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя разумнее не просто игнорить, а указать правильную ITERATE. Ну и не прогавкать опустошение курсора во избежание бесконечного цикла.
...
Рейтинг: 0 / 0
Остановка курсива при пустой выборке
    #39542307
chiffacff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinachiffacffкак правильнее решить данную задачу?
Код: sql
1.
DECLARE CONTINUE HANDLER FOR NOT FOUND BEGIN END;


PS. "Курсив" на самом деле называется "курсор".

угу.... курсор....

я использую DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_finished = 1; для остановки курсора

вот вся процедура:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE cursor_finished, has_error INTEGER DEFAULT 0;
DECLARE cur1 CURSOR FOR
		select is from users;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_finished = 1;


OPEN cur1;

 REPEAT		
 FETCH cur1 INTO UserIdGet
 
 IF cursor_finished = 0 THEN


SELECT balance INTO BalanceGet FROM acc WHERE user_id = UserIdGet;
 

 END IF;
 Until cursor_finished END REPEAT;
	CLOSE cur1;
...
Рейтинг: 0 / 0
Остановка курсива при пустой выборке
    #39542371
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DECLARE NotFoundFlag INTEGER;
DECLARE cur1 CURSOR FOR SELECT is FROM users;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET NotFoundFlag = 1;

OPEN cur1;
perform:
LOOP
  SET NotFoundFlag := 0;
  FETCH cur1 INTO UserIdGet;
  IF NotFoundFlag THEN LEAVE perform;
  SELECT balance INTO BalanceGet FROM acc WHERE user_id = UserIdGet;
END LOOP;
CLOSE cur1;


Только непонятно, что есть BalanceGet - где декларировано и как используется.
...
Рейтинг: 0 / 0
Остановка курсива при пустой выборке
    #39542627
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DECLARE NotFoundFlag INTEGER;
DECLARE cur1 CURSOR FOR SELECT is FROM users;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET NotFoundFlag = 1;

OPEN cur1;
perform:
LOOP
  SET NotFoundFlag := 0;
  FETCH cur1 INTO UserIdGet;
  IF NotFoundFlag THEN LEAVE perform;
  SELECT balance INTO BalanceGet FROM acc WHERE user_id = UserIdGet;
END LOOP;
CLOSE cur1;



Только непонятно, что есть BalanceGet - где декларировано и как используется.

Методологикали ("по методологии" -- как это сказать по русски?)
обработка ошибки -- вполне достойный вариант.

но есть и другие -- например вернуть NULL .
Очивидно (на всякий надо уточнить) что user_id ту уникальныуй ключ,
тогда просто заменить селект на

SELECT MAX(balance) INTO BalanceGet FROM acc WHERE user_id = UserIdGet;

...и проверять на NULL

-----------------------

еще вариант -- на мой взгляд самый правильный --
в изначальном селекте для курсора выбирать только
существующие user_id. Например тупо добавить WHERE EXISTS....

Вообще надо проанализировать
каким образом на главный запрос (курсор) могут попасть
условия для выборки несушествующих ИД...
...
Рейтинг: 0 / 0
Остановка курсива при пустой выборке
    #39542642
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcвариант -- на мой взгляд самый правильный --
в изначальном селекте для курсора выбирать только
существующие user_id. Например тупо добавить WHERE EXISTS....+100500.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Остановка курсива при пустой выборке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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