Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SET / 10 сообщений из 10, страница 1 из 1
28.02.2006, 22:39
    #33572171
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET
Всегда с удовольствием пользовался "множественным присваиванием" наподобие
Код: 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
01.03.2006, 05:46
    #33572318
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET
У меня такие конструкции в хранимках проходили и в SET и в условиях WHERE. У конструкции имеется недостаток - сильно зависит от данных:
1) SELECT возвращает несколько записей - полный облом;
2) SELECT не возвращает ни одной записи:
SET заткнется если, а в левой части переменные объявлены без NULL
сравнение в WHERE типа (A,... ) = (NULL, ...) может дать результат, от которого глаз выпадет;
3) SELECT возвращает единственную запись, но одно или несколько полей имеют значение NULL - см. 2)
...
Рейтинг: 0 / 0
01.03.2006, 08:38
    #33572430
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET
Нука-нука, что у вас получается при попытке скомпилировать
Код: 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
01.03.2006, 08:53
    #33572450
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET
golsaУ меня такие конструкции в хранимках проходили и в SET и в условиях WHERE. У конструкции имеется недостаток - сильно зависит от данных:
1) SELECT возвращает несколько записей - полный облом;

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

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

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

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

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

3) SELECT возвращает единственную запись, но одно или несколько полей имеют значение NULL - см. 2)
...
Рейтинг: 0 / 0
01.03.2006, 10:05
    #33572616
poiuytr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET
Victor MetelitsaSELECT INTO, судя по описанию, тоже работать не будет. SELECT INTO работает в SP, я пробовал.
...
Рейтинг: 0 / 0
01.03.2006, 10:21
    #33572681
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET
Спасибо!
Код: 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
01.03.2006, 13:03
    #33573477
Astron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET
Victor Metelitsa А там такое почему-то не компилируется (причём судя по документации, должно)! В функциях и триггерах всё ОК, а в SP - нет.
Я крайне шокирован и недоволен.
SELECT INTO, судя по описанию, тоже работать не будет.

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

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


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