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

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
 #set delimiter 
CREATE FUNCTION GUZHANOV.F_CONT_COUNT
  	(D2 DATE,
    D1 DATE,
    SIGN VARCHAR( 1 ),
    RE VARCHAR( 1 ),
    MAIN VARCHAR( 1 ),
    ACTI VARCHAR( 1 ),
    STOP VARCHAR( 1 ),
    CLO VARCHAR( 1 ))
  RETURNS TABLE TA
  	(FILIAL VARCHAR( 64 ),
  	SIGNING INTEGER,
    REG INTEGER,
    MAINTAIN INTEGER,
    ACTIVE INTEGER,
    STOPPING INTEGER,
    CLOSE_ INTEGER,
    SIGNING_SUM INTEGER,
    REG_SUM INTEGER,
    MAINTAIN_SUM INTEGER,
    ACTIVE_SUM INTEGER,
    STOPPING_SUM INTEGER,
    CLOSE_SUM INTEGER
    )
  SPECIFIC GUZHANOV.F_CONT_COUNT
  LANGUAGE SQL
  NOT DETERMINISTIC
  READS SQL DATA
  NO EXTERNAL ACTION
  ------------------------------------------------------------------------
-- SQL Function                                                         
------------------------------------------------------------------------
BEGIN ATOMIC

SET SIGNING_SUM =  0 ;
SET REG_SUM =  0 ;
SET MAINTAIN_SUM =  0 ;
SET ACTIVE_SUM =  0 ;
SET STOPPING_SUM =  0 ;
SET CLOSE_SUM =  0 ;
    
FOR get_fil as
  select fullname as filial, id_person as id_f from FORM.JURIDICAL 
  	where id_person in (
	 select id_person from FORM.JURIDICAL where (id_person in
	 (select id_person_child from FORM.JURIDICAL_RELATION where id_person= 27 )
	 or id_person in (select id_person_child from FORM.JURIDICAL_RELATION where id_person in
	 (select id_person_child from FORM.JURIDICAL_RELATION where id_person= 27 ))
	  or (id_person in ( 24 ,  27 )))
	  and end_date is null) 
      and end_date is null 
DO
 	SET FILIAL  = get_fil.filial;
    IF SIGN = 'Y' THEN
      	SET SIGNING = select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        where c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2 -- и  дополнительные условия для SIGN;
    ELSE
    	SET SIGNING =  0 ;
    END IF;
    IF RE = 'Y' THEN
      	SET REG = select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        where c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2 -- и  дополнительные условия для RE;
    ELSE
    	SET REG =  0 ;
    END IF;
    IF MAIN = 'Y' THEN
      	SET MAINTAIN = select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        where c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2 -- и  дополнительные условия для MAIN;
    ELSE
    	SET MAINTAIN =  0 ;
    END IF;
    IF ACTI = 'Y' THEN
      	SET ACTIVE = select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        WHERE c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2 -- и  дополнительные условия для ACTI;
    ELSE
    	SET ACTIVE =  0 ;
    END IF;
    IF STOP = 'Y' THEN
      	SET STOPPING = select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        WHERE c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2 -- и  дополнительные условия для STOP;
    ELSE
    	SET STOPPING =  0 ;
    END IF;
    IF CLO = 'Y' THEN
      	SET CLOSE_ = select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        WHERE c.id_fund=get_fil.id_f 
 		AND c.sign_date between D1 and D2 -- и  дополнительные условия для CLO;
    ELSE
    	SET CLOSE_ -  0 ;
    END IF;
	SET SIGNING_SUM = SIGNING_SUM + SIGNING;
	SET REG_SUM = REG_SUM + REG;
	SET MAINTAIN_SUM = MAINTAIN_SUM + MAINTAIN;
	SET ACTIVE_SUM = ACTIVE_SUM + ACTIVE;
	SET STOPPING_SUM = STOPPING_SUM + STOPPING;
	SET CLOSE_SUM = CLOSE_SUM + CLOSE_;
END FOR;
  	RETURN
    	SELECT
    	FILIAL,
  		SIGNING,
    	REG,
    	MAINTAIN,
    	ACTIVE,
    	STOPPING,
    	CLOSE_,
    	SIGNING_SUM,
    	REG_SUM,
    	MAINTAIN_SUM,
    	ACTIVE_SUM,
    	STOPPING_SUM,
    	CLOSE_SUM
        from TA;
  
END@

Скрипт отрабатывает без ошибок, но в базе функция не появляется.
Ранее подобное доводилось делать только в FireBird, там подобное работало, даже гораздо проще все было.

Задача в следующем: Надо получить количество заключенных договоров за определенный период, с разбивкой по филиалам, и с определенными статусами (SIGN, RE, MAIN, ACTI, STOP, CLO - это условия, надо ли выбирать договора с данным статусом ('Y' или 'N')

Подскажите, что я делаю не так, и как сделать, чтобы функция создалась в базе и выдавала нужную мне информацию.
...
Рейтинг: 0 / 0
Скрипт отрабатывает, а функция не создается.
    #36346503
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал скрипт вот в такой вид. Так же отрабатывается скрипт без ошибок, но функция не появляется в базе:

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
 #set delimiter 
CREATE FUNCTION GUZHANOV.F_CONT_COUNT
  	(D2 DATE,
    D1 DATE,
    SIGN VARCHAR( 1 ),
    RE VARCHAR( 1 ),
    MAIN VARCHAR( 1 ),
    ACTI VARCHAR( 1 ),
    STOP VARCHAR( 1 ),
    CLO VARCHAR( 1 ))
  RETURNS TABLE
  	(FILIAL VARCHAR( 64 ),
  	SIGNING INTEGER,
    REG INTEGER,
    MAINTAIN INTEGER,
    ACTIVE INTEGER,
    STOPPING INTEGER,
    CLOSE_ INTEGER,
    SIGNING_SUM INTEGER,
    REG_SUM INTEGER,
    MAINTAIN_SUM INTEGER,
    ACTIVE_SUM INTEGER,
    STOPPING_SUM INTEGER,
    CLOSE_SUM INTEGER
    )
  SPECIFIC GUZHANOV.F_CONT_COUNT
  LANGUAGE SQL
--  NOT DETERMINISTIC
  READS SQL DATA
--  NO EXTERNAL ACTION
  ------------------------------------------------------------------------
-- SQL Function                                                         
------------------------------------------------------------------------
BEGIN ATOMIC
DECLARE SIGNING_SUM integer;
DECLARE REG_SUM integer;
DECLARE MAINTAIN_SUM integer;
DECLARE ACTIVE_SUM integer;
DECLARE STOPPING_SUM integer;
DECLARE CLOSE_SUM integer;
SET SIGNING_SUM =  0 ;
SET REG_SUM =  0 ;
SET MAINTAIN_SUM =  0 ;
SET ACTIVE_SUM =  0 ;
SET STOPPING_SUM =  0 ;
SET CLOSE_SUM =  0 ;
 
CREATE TABLE TEMP.TA(FILIAL VARCHAR( 64 ),
  	SIGNING INTEGER,
    REG INTEGER,
    MAINTAIN INTEGER,
    ACTIVE INTEGER,
    STOPPING INTEGER,
    CLOSE_ INTEGER,
    SIGNING_SUM INTEGER,
    REG_SUM INTEGER,
    MAINTAIN_SUM INTEGER,
    ACTIVE_SUM INTEGER,
    STOPPING_SUM INTEGER,
    CLOSE_SUM INTEGER
    );
    COMMIT; 
   
FOR get_fil as
  select fullname as filial, id_person as id_f from FORM.JURIDICAL 
  	where id_person in (
	 select id_person from FORM.JURIDICAL where (id_person in
	 (select id_person_child from FORM.JURIDICAL_RELATION where id_person= 27 )
	 or id_person in (select id_person_child from FORM.JURIDICAL_RELATION 
     where id_person in
	 (select id_person_child from FORM.JURIDICAL_RELATION where id_person= 27 ))
	  or (id_person in ( 24 ,  27 )))
	  and end_date is null) 
      and end_date is null 
DO
	INSERT INTO TEMP.TA (FILIAL,
  	SIGNING,
        REG,
        MAINTAIN,
        ACTIVE,
        STOPPING,
        CLOSE_,
        SIGNING_SUM,
        REG_SUM,
        MAINTAIN_SUM,
        ACTIVE_SUM,
        STOPPING_SUM,
        CLOSE_SUM) values (
    	get_fil.filial,
        null,
        NULL,
        null,
        null,
        NULL,
        null,
        null,
        null,
        null,
        NULL,
        NULL,
        null
    );
    COMMIT;
 --	SET FILIAL  = get_fil.filial;
    IF SIGN = 'Y' THEN
      	update TEMP.TA SET SIGNING = (select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        where c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2)
        where filial = get_fil.filial;
        COMMIT;
    ELSE
    	update TEMP.TA SET SIGNING =  0  where filial = get_fil.filial;
        COMMIT;
    END IF;
    IF RE = 'Y' THEN
      	update TEMP.TA SET REG = (select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        where c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2)
        where filial = get_fil.filial;
        COMMIT;
    ELSE
    	update TEMP.TA SET REG =  0  where filial = get_fil.filial;
        COMMIT;
    END IF;
    IF MAIN = 'Y' THEN
      	update TEMP.TA SET MAINTAIN = (select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        where c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2)
        where filial = get_fil.filial;
        COMMIT;
    ELSE
    	update TEMP.TA SET MAINTAIN =  0  where filial = get_fil.filial;
        COMMIT;
    END IF;
    IF ACTI = 'Y' THEN
      	update TEMP.TA SET ACTIVE = (select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        WHERE c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2)
        where filial = get_fil.filial;
        COMMIT;
    ELSE
    	update TEMP.TA SET ACTIVE =  0  where filial = get_fil.filial;
        COMMIT;
    END IF;
    IF STOP = 'Y' THEN
      	update TEMP.TA SET STOPPING = (select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        WHERE c.id_fund=get_fil.id_f 
 		and c.sign_date between D1 and D2;
        COMMIT;
    ELSE
    	update TEMP.TA SET STOPPING =  0  where filial = get_fil.filial;
        COMMIT;
    END IF;
    IF CLO = 'Y' THEN
      	update TA SET CLOSE_ = (select COUNT(c.*)
    	from REGISTR.CONTRACT c 
        WHERE c.id_fund=get_fil.id_f 
 		AND c.sign_date between D1 and D2)
        where filial = get_fil.filial;
        COMMIT;
    ELSE
    	update TEMP.TA SET CLOSE_ =  0  where filial = get_fil.filial;
        COMMIT;
    END IF;
	update TEMP.TA SET SIGNING_SUM = SIGNING_SUM + SIGNING;
	update TEMP.TA SET REG_SUM = REG_SUM + REG;
	update TEMP.TA SET MAINTAIN_SUM = MAINTAIN_SUM + MAINTAIN;
	update TEMP.TA SET ACTIVE_SUM = ACTIVE_SUM + ACTIVE;
	update TEMP.TA SET STOPPING_SUM = STOPPING_SUM + STOPPING;
	update TEMP.TA SET CLOSE_SUM = CLOSE_SUM + CLOSE_;
    COMMIT;
END FOR;
  	RETURN
    	SELECT
    	FILIAL,
  	SIGNING,
    	REG,
    	MAINTAIN,
    	ACTIVE,
    	STOPPING,
    	CLOSE_,
    	SIGNING_SUM,
    	REG_SUM,
    	MAINTAIN_SUM,
    	ACTIVE_SUM,
    	STOPPING_SUM,
    	CLOSE_SUM
        from TEMP.TA;
  	DROP TABLE TEMP.TA;
    COMMIT;
END@
...
Рейтинг: 0 / 0
Скрипт отрабатывает, а функция не создается.
    #36346814
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Гужанов,

Как вы определяете, что функция не появилась?
...
Рейтинг: 0 / 0
Скрипт отрабатывает, а функция не создается.
    #36346923
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переподключаюсь к базе и смотрю в списке функций. Там этой функции нет. Кроме того, если повторно запустить скрипт, то он опять отрабатывает успешно, а если бы функция с таким именем уже была, то он выдал бы ошибку.
...
Рейтинг: 0 / 0
Скрипт отрабатывает, а функция не создается.
    #36347662
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я всё же не понимаю, как такая функция может скомпилироваться:
В sql функции нельзя
- create table
- commit
- update | insert | delete если функция READS SQL DATA

1. Из какой программы (которая пишет вам в ответ, что всё успешно на такое определение) вы создаёте эту функцию?

2. Если вы хотите командным процессором создавать её, то в файле вы пишете:
Код: plaintext
1.
2.
3.
4.
5.
--#SET TERMINATOR @
CREATE FUNCTION
...
BEGIN ATOMIC
...
END@
И
db2 -f file.sql
...
Рейтинг: 0 / 0
Скрипт отрабатывает, а функция не создается.
    #36347688
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein
В sql функции нельзя
- create table
- commit
- update | insert | delete если функция READS SQL DATA

1. Из какой программы (которая пишет вам в ответ, что всё успешно на такое определение) вы создаёте эту функцию?



Я запускаю скрипт в EMS SQL Manager 2007 for DB2

А что тогда указать в SQL DATA, чтобы можно было делать update, insert, delete? READ/WRITE?
...
Рейтинг: 0 / 0
Скрипт отрабатывает, а функция не создается.
    #36347722
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел ГужановЯ запускаю скрипт в EMS SQL Manager 2007 for DB2

А что тогда указать в SQL DATA, чтобы можно было делать update, insert, delete? READ/WRITE?
MODIFIES SQL DATA
Почитайте CREATE FUNCTION .

P.S.:
1. я бы не стал использовать эту программу, если она такие вещи вытворяет...
2. если вы не можете обойтись без таблицы для временных результатов, используйте лучше хранимую процедуру: там можно в отличии от ф-ции использовать временные таблицы.
А то вам придётся использовать постоянную таблицу для этого в ф-ции, что, имхо, неправильно...
...
Рейтинг: 0 / 0
Скрипт отрабатывает, а функция не создается.
    #36348000
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Вам огромное, Марк.

Исправил все ошибки, функция работает нормально.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Скрипт отрабатывает, а функция не создается.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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