powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Процедура отказывается работать. Помогите найти причину.
4 сообщений из 4, страница 1 из 1
Процедура отказывается работать. Помогите найти причину.
    #36481164
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть ранее я задавал вопрос по этой процедуре, разобрался, создал. Вот такой скрипт:

Код: plaintext
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.
CREATE PROCEDURE TEMP.UPD_ONEADDR()
  SPECIFIC TEMP.UPD_ONEADDR
  MODIFIES SQL DATA 
  NOT DETERMINISTIC
  LANGUAGE SQL
BEGIN
DECLARE pers Integer;
DECLARE op integer;
DECLARE st_date date;
FOR addr AS (SELECT insurance_number, B_address, R_address, l_address FROM temp.address_) DO
BEGIN
   SET pers = (SELECT max(id_person) FROM form.natural WHERE insurance_number=addr.insurance_number and end_date is null);
   SET op = (SELECT max(id_operation) FROM form.natural WHERE insurance_number=addr.insurance_number and end_date is null);
   SET st_date = (SELECT max(start_date) FROM form.natural WHERE insurance_number=addr.insurance_number and end_date is null); 
   /* адрес рождения */
   IF EXISTS (SELECT oneaddress FROM form.address WHERE id_person=pers and type='B') THEN
 	 BEGIN	
         IF (SELECT oneaddress FROM form.address WHERE id_person=pers and type='B')=null THEN
	  	   UPDATE form.address SET oneaddress=addr.b_address, start_date=st_date
		   		  WHERE id_person=pers and type='B';
	 END IF;
         END;
	 ELSE
         BEGIN
         INSERT INTO form.address (id_person, oneaddress, type, start_date, id_operation)
            values (pers, addr.b_address, 'B', st_date, op);
 	 END;
   END IF;
END;
END FOR;
END;

При запуске процедуры получаю ошибку
Код: plaintext
SQL0811N  The result of a scalar fullselect, SELECT INTO statement, or VALUES INTO statement is more than one row.  SQLSTATE= 21000 
Из-за этой ошибки я и добавил max в получении значений переменных. Но все равно та же ошибка. В чем причина и как с этим бороться??
...
Рейтинг: 0 / 0
Процедура отказывается работать. Помогите найти причину.
    #36481288
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
IF (SELECT oneaddress FROM form.address WHERE id_person=pers and type='B')=null THEN
Вау, это 9.7 позволяет такое компилировать, да?

Кстати, можно
Код: plaintext
1.
SET (pers,op,st_date)=(SELECT max(id_person),max(id_operation),max(start_date)...
И с MERGE разберитесь, и http://mysite.verizon.net/graeme_birchall/id1.html читайте.
...
Рейтинг: 0 / 0
Процедура отказывается работать. Помогите найти причину.
    #36481841
BuryCommoner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка значит, что выборка возвращает более одной строки. Обычно это означает, что не до конца продуман алгоритм или сама структура, хотя иногда это нормально. В таких случаях в выборке используйте FETCH FIRST ROW ONLY.
Код: plaintext
IF (SELECT oneaddress FROM form.address WHERE id_person=pers and type='B')=null THEN
Условие некорректное. Для сравнения с NULL нужно использовать IS NULL или IS NOT NULL. При всех других операциях будет возвращаться ложь. Для лучшего понимания почитайте про троичную логику.

Victor Metelitsa Вау, это 9.7 позволяет такое компилировать, да?
9.7 много чего позволяет. Он перестал ругаться даже на попытку присвоения в числовую переменную строки, или наоборот. Или, когда строки складываются не конкатенацией, а арифметической суммой. Много времени уходило на поиски ошибки, когда при выполении DB2 выдает что-то типа функция "INTEGER вызвала исключение...", а в коде процедуры даже намекане неё нет :)
---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
Процедура отказывается работать. Помогите найти причину.
    #36491860
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел,

В данном случае ошибка происходит в
Код: plaintext
IF (SELECT oneaddress FROM form.address WHERE id_person=pers and type='B')=null THEN
- subselect возвращает несколько записей - так нельзя.
По поводу максимумов: вам действительно всё равно, из какой именно из нескольких записей придёт каждый из 3-х максимумов (а они могут из разных записей прийти)?
Ну и логика, которую вы реализовываете, не очень понятна из текста...
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Процедура отказывается работать. Помогите найти причину.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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