Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Процедура отказывается работать. Помогите найти причину. / 4 сообщений из 4, страница 1 из 1
20.02.2010, 10:33
    #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
20.02.2010, 13:32
    #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
21.02.2010, 09:42
    #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
27.02.2010, 12:19
    #36491860
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура отказывается работать. Помогите найти причину.
Павел,

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


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