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

Код: 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.
CREATE FUNCTION DATA.F_CONT_COUNT(D1 DATE, D2 Date)
  RETURNS table (FILIAL VARCHAR( 64 ), KOL int, Share VARCHAR( 16 ))
  SPECIFIC DATA.F_CONT_COUNT
  LANGUAGE SQL
  NOT DETERMINISTIC
  READS SQL DATA
  NO EXTERNAL ACTION
  ------------------------------------------------------------------------
-- SQL Function                                                         
------------------------------------------------------------------------
BEGIN ATOMIC
 declare id_f int;
 declare kol_all int;
  
 select COUNT(*) as KOL_all from DATA.JURIDICAL 
 	where sign_date between D1 and D2;
    
 FOR get_fil as
  select fullname as filial, id_person as id_f from DATA.JURIDICAL 
  	where id_person in ( 24 ,  27 )
	 and end_date is null 
 DO
    select COUNT(*) as KOL, 
    CHAR(KOL/(kol_all/ 100 ))||'%' as Share 
    from DATA.JURIDICAL 
 	where id_fund=id_f 
 	and sign_date between D1 and D2;
    
 END FOR;

 RETURN  
    select FILIAL, KOL, SHARE
    from table;
  
END;

При запуске скрипта получаю ошибку:

[IBM][CLI Driver][DB2/NT64] SQL0104N Обнаружен неправильный элемент "END-OF-STATEMENT" после текста "and D2; END FOR". Список правильных элементов: "<delim_semicolon>".

Если я убираю END FOR; получается такая же ошибка, только ругается уже на последний END;

Что я делаю не так, подскажите.
...
Рейтинг: 0 / 0
Проблема с созданием функции
    #36335265
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обыная (для DB2-новичков) проблема с разделителями.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE FUNCTION DATA.F_CONT_COUNT(D1 DATE, D2 Date)
...
RETURN  
    select FILIAL, KOL, SHARE
    from table;
  
END @

db2 -f файл.sql -td@

(вместо '@' можно поискать что-то другое).
...
Рейтинг: 0 / 0
Проблема с созданием функции
    #36335571
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно ли сделать скрипт, чтобы запускать его не из командной строки? Я использую SQL Manager for DB2.
Если нельзя, то как мне настроить командную строку DB2, чтобы она понимала русские буквы? А то я запустил скрипт из командной строки и получил какое-то сообщение об ошибке, или, может быть, о нормальном выполнении скрипта, а прочитать его не могу.
...
Рейтинг: 0 / 0
Проблема с созданием функции
    #36335640
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Гужанов,

Command line processor features :
...
To correctly display the national characters for single byte (SBCS) languages from the DB2 command line processor window, a True Type font must be selected. For example, in a Windows environment, open the command window properties notebook and select a font such as Lucinda Console.
...
...
Рейтинг: 0 / 0
Проблема с созданием функции
    #36335800
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрипт стал вот таким:

Код: 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.
CREATE FUNCTION DATA.F_CONT_COUNT(D1 DATE, D2 Date)
  RETURNS table (FILIAL VARCHAR( 64 ), KOL int, Share VARCHAR( 16 ))
  SPECIFIC DATA.F_CONT_COUNT
  LANGUAGE SQL
  NOT DETERMINISTIC
  READS SQL DATA
  NO EXTERNAL ACTION
------------------------------------------------------------------------
-- SQL Function                                                         
------------------------------------------------------------------------
BEGIN ATOMIC
 declare id_f int;
 declare kol_all int;
  
 select COUNT(*) as KOL_all from DATA.JURIDICAL 
 	where sign_date between D1 and D2;
    
 FOR get_fil as
  select fullname as filial, id_person as id_f from DATA.JURIDICAL 
  	where id_person in ( 24 ,  27 )
	 and end_date is null 

 DO
 	select COUNT(*) as KOL, 
    CHAR(KOL/(kol_all/ 100 ))||'%' as Share 
    from DATA.JURIDICAL 
 	where id_fund=id_f 
 	and sign_date between D1 and D2;
    
 END FOR;
 
 RETURN  
    select FILIAL, KOL, SHARE
    from table;
  
END@

Запускаю так:

Код: plaintext
db2 -f "C:\MyFile.sql" -td@

получаю ошибку "DB21007E При чтении команды достигнут конец файла."

Пробовал ставить после END FOR тоже @, ошибка та же самая.
...
Рейтинг: 0 / 0
Проблема с созданием функции
    #36335894
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел ГужановЗапускаю так:

Код: plaintext
db2 -f "C:\MyFile.sql" -td@

получаю ошибку "DB21007E При чтении команды достигнут конец файла."

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

Код: 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.
#set delimiter @
CREATE FUNCTION DATA.F_CONT_COUNT(D1 DATE, D2 Date)
  RETURNS table (FILIAL VARCHAR( 64 ), KOL int, Share VARCHAR( 16 ))
  SPECIFIC DATA.F_CONT_COUNT
  LANGUAGE SQL
  NOT DETERMINISTIC
  READS SQL DATA
  NO EXTERNAL ACTION
------------------------------------------------------------------------
-- SQL Function                                                         
------------------------------------------------------------------------
BEGIN ATOMIC
 declare id_f int;
 declare kol_all int;
  
 select COUNT(*) as KOL_all from DATA.JURIDICAL 
 	where sign_date between D1 and D2;
    
 FOR get_fil as
  select fullname as filial, id_person as id_f from DATA.JURIDICAL 
  	where id_person in ( 24 ,  27 )
	 and end_date is null 
 DO
 	select COUNT(*) as KOL, 
    CHAR(KOL/(kol_all/ 100 ))||'%' as Share 
    from DATA.JURIDICAL 
 	where id_fund=id_f 
 	and sign_date between D1 and D2;
    
 END FOR@
 
 -- RETURN  
 --   select FILIAL, KOL, SHARE
 --   from table;
  
END@

Скрипт выполняется успешно, но функция в базе не появляется. Я предположил, что это из-за того, что в функции нет раздела RETURN. Если снять комментарии со строк

Код: plaintext
1.
2.
RETURN  
   select FILIAL, KOL, SHARE
   from table;

то появляется ошибка [IBM][CLI Driver][DB2/NT64] SQL0104N Обнаружен неправильный элемент "END-OF-STATEMENT" после текста "END@". Список правильных элементов: "JOIN <joined_table>". SQLSTATE=42601

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

После 'end for' надо ; ставить.
Но и в этом случае не отработает, т.к. внутри for вы "в никуда" select делаете.
Предположительно ваша функция должна выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE FUNCTION DATA.F_CONT_COUNT(D1 DATE, D2 Date)
RETURNS table (FILIAL VARCHAR( 64 ), KOL int, Share VARCHAR( 16 ))
return 
select 
  get_fil.fullname
, g.kol
, char(g.kol* 100 /(
  select nullif(count( 1 ),  0 )
  from DATA.JURIDICAL 
  where sign_date between D1 and D2))||'%'
from DATA.JURIDICAL get_fil 
join (
select id_fund, count( 1 ) 
from DATA.JURIDICAL 
where sign_date between D1 and D2 
group by id_fund
) g (id_fund, kol) on g.id_fund = get_fil.id_person 
where get_fil.id_person in ( 24 ,  27 ) and get_fil.end_date is null@
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема с созданием функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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