powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SET
10 сообщений из 10, страница 1 из 1
SET
    #33572171
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда с удовольствием пользовался "множественным присваиванием" наподобие
Код: plaintext
1.
2.
3.
4.
5.
   SET (NEW_VAR.SALARY, NEW_VAR.COMM) = ( 10000 , NEW_VAR.SALARY); 
   SET (NEW_VAR.SALARY, NEW_VAR.COMM)
      = (SELECT AVG(SALARY), AVG(COMM)
           FROM EMPLOYEE E
           WHERE E.WORKDEPT = NEW_VAR.WORKDEPT); 
(описание на http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/r0001018.htm )

И наконец нарвался. Дело в том, что я наконец сподобился написать небольшую хранимую процедуру. А там такое почему-то не компилируется (причём судя по документации, должно)! В функциях и триггерах всё ОК, а в SP - нет. Я проверял на FP11 и FP10.

Я крайне шокирован и недоволен. Сами понимаете, одно дело
Код: plaintext
1.
2.
3.
4.
   SET (NEW_VAR.SALARY, NEW_VAR.COMM)
      = (SELECT AVG(SALARY), AVG(COMM)
           FROM EMPLOYEE E
           WHERE E.WORKDEPT = NEW_VAR.WORKDEPT); 
и другое
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
   
   SET NEW_VAR.SALARY
      = (SELECT AVG(SALARY)
           FROM EMPLOYEE E
           WHERE E.WORKDEPT = NEW_VAR.WORKDEPT); 
   SET NEW_VAR.COMM
      = (SELECT AVG(COMM)
           FROM EMPLOYEE E
           WHERE E.WORKDEPT = NEW_VAR.WORKDEPT); 

SELECT INTO, судя по описанию, тоже работать не будет.

Я выкручусь через FOR (на самом деле в той ситуации так даже лучше), но...
...
Рейтинг: 0 / 0
SET
    #33572318
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня такие конструкции в хранимках проходили и в SET и в условиях WHERE. У конструкции имеется недостаток - сильно зависит от данных:
1) SELECT возвращает несколько записей - полный облом;
2) SELECT не возвращает ни одной записи:
SET заткнется если, а в левой части переменные объявлены без NULL
сравнение в WHERE типа (A,... ) = (NULL, ...) может дать результат, от которого глаз выпадет;
3) SELECT возвращает единственную запись, но одно или несколько полей имеют значение NULL - см. 2)
...
Рейтинг: 0 / 0
SET
    #33572430
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нука-нука, что у вас получается при попытке скомпилировать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE VVM.XXX()
BEGIN
  DECLARE a     INTEGER;
  DECLARE b     INTEGER;
  DECLARE c     INTEGER;
  SET (a,b,c) = ( 1 , 2 , 3 );
END @
?

У меня
Код: 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.
31.
32.
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0104N  An unexpected token "SET" was found following "LARE c     INTEGER; 
".  Expected tokens may include:  "<psm_while>".  LINE NUMBER=5.  
SQLSTATE=42601

SQL0104N  An unexpected token "SET" was found following "LARE c     INTEGER;
".  Expected tokens may include:  "<psm_while>                                  ".

Explanation: 

A syntax error in the SQL statement or the input command string 
for the SYSPROC.ADMIN_CMD procedure was detected at the specified 
token following the text "<text>".  The "<text>" field indicates 
the 20 characters of the SQL statement or the input command 
string for the SYSPROC.ADMIN_CMD procedure that preceded the 
token that is not valid.  

 As an aid, a partial list of valid tokens is provided in the 
SQLERRM field of the SQLCA as "<token-list>".  This list assumes 
the statement is correct to that point.  

 The statement cannot be processed.  

User Response: 

Examine and correct the statement in the area of the specified 
token.  

 sqlcode :  -104 

 sqlstate :  42601 
...
Рейтинг: 0 / 0
SET
    #33572450
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golsaУ меня такие конструкции в хранимках проходили и в SET и в условиях WHERE. У конструкции имеется недостаток - сильно зависит от данных:
1) SELECT возвращает несколько записей - полный облом;

Так и должно быть, и это правильно. Можете пользоваться FETCH FIRST 1 ROW ONLY

2) SELECT не возвращает ни одной записи:
SET заткнется если, а в левой части переменные объявлены без NULL

Так и должно быть, и это правильно.

сравнение в WHERE типа (A,... ) = (NULL, ...) может дать результат, от которого глаз выпадет;

Так не должно быть. Можете привести пример?

3) SELECT возвращает единственную запись, но одно или несколько полей имеют значение NULL - см. 2)
...
Рейтинг: 0 / 0
SET
    #33572616
poiuytr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor MetelitsaSELECT INTO, судя по описанию, тоже работать не будет. SELECT INTO работает в SP, я пробовал.
...
Рейтинг: 0 / 0
SET
    #33572681
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE VVM.XXX()
BEGIN
  DECLARE a     INTEGER;
  DECLARE b     INTEGER;
  DECLARE c     INTEGER;
  VALUES ( 1 , 2 , 3 ) INTO a,b,c;
END 
DB20000I  The SQL command completed successfully.
...
Рейтинг: 0 / 0
SET
    #33573477
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Metelitsa А там такое почему-то не компилируется (причём судя по документации, должно)! В функциях и триггерах всё ОК, а в SP - нет.
Я крайне шокирован и недоволен.
SELECT INTO, судя по описанию, тоже работать не будет.

Да, есть такая буква. На всех SP. В доке этого нет, достаточно редкий для IBM прокол. SELECT INTO однако работает, согласно доки, тут у них порядок как обычно.
...
Рейтинг: 0 / 0
SET
    #33575699
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET (a,b,c) = VALUES (1,2,3);

А на счет WHERE (A,... ) = (NULL, ...) - так это всегда False какое бы значение поле A не имело (в том числе и NULL). Это поведение прописано в доках, но приводит в некоторый ступор.
...
Рейтинг: 0 / 0
SET
    #33575911
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оба утверждения неверны. SET (a,b,c) = VALUES (1,2,3) не компилируется внутри SP. а результатом сравнения чего-то с NULL является UNKNOWN, а не FALSE.
...
Рейтинг: 0 / 0
SET
    #33575914
poiuytr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть потому, что поле не может быть равно NULL, а может быть только IS NULL.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SET
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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