Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема с созданием функции / 8 сообщений из 8, страница 1 из 1
27.11.2009, 10:55
    #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
27.11.2009, 11:40
    #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
27.11.2009, 13:18
    #36335571
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с созданием функции
А можно ли сделать скрипт, чтобы запускать его не из командной строки? Я использую SQL Manager for DB2.
Если нельзя, то как мне настроить командную строку DB2, чтобы она понимала русские буквы? А то я запустил скрипт из командной строки и получил какое-то сообщение об ошибке, или, может быть, о нормальном выполнении скрипта, а прочитать его не могу.
...
Рейтинг: 0 / 0
27.11.2009, 13:38
    #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
27.11.2009, 14:26
    #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
27.11.2009, 14:53
    #36335894
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с созданием функции
Павел ГужановЗапускаю так:

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

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

Пробовал ставить после END FOR тоже @, ошибка та же самая.Скорее всего файл не в кодировке 1251, либо в нём какие-то непечатаемые символы.
...
Рейтинг: 0 / 0
27.11.2009, 15:28
    #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
27.11.2009, 16:14
    #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
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Проблема с созданием функции / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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