Гость
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / User defined functions / 25 сообщений из 33, страница 1 из 2
16.06.2005, 23:36
    #33120658
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
как запускать чтобы проверить результат?
...
Рейтинг: 0 / 0
17.06.2005, 09:47
    #33121013
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
Запускать - просто в CLP.
Если процедура типа:
Код: 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.
connect to test

   Database Connection Information

 Database server        = DB2/NT  8 . 2 . 0 
 SQL authorization ID   = DB2ADMIN
 Local database alias   = TEST


create procedure testproc ( in par1 int, inout par2 int,out par3 int)
language sql
begin
	set par2=par1+par2;
	set par3=(par1+par2)* 2 ;
end

DB20000I  The SQL command completed successfully.

call testproc( 1 , 2 ,?)

  Value of output parameters
  --------------------------
  Parameter Name  : PAR2
  Parameter Value :  3 

  Parameter Name  : PAR3
  Parameter Value :  8 

  Return Status =  0 



а чтобы протестировать функцию существует выражение values

Код: 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.
db2 => connect to test

   Database Connection Information

 Database server        = DB2/NT  8 . 2 . 0 
 SQL authorization ID   = DB2ADMIN
 Local database alias   = TEST

db2 => values current date -  1  years +  365  days
 1 
----------
 17 . 06 . 2005 

   1  record(s) selected.

db2 => values days(current date)

 1 
-----------
      732114 

   1  record(s) selected.

db2 =>
...
Рейтинг: 0 / 0
18.06.2005, 16:45
    #33123183
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
Спасибо. А есть ли тип данных table? Что-то я не нашел в хелпе...
...
Рейтинг: 0 / 0
18.06.2005, 17:48
    #33123206
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
м да спросил :) вернее может ли UDF возвратить данные в таблице?
что-то типа
Код: plaintext
1.
2.
create procedure Split (in @input text, in @delimiter varchar( 1 ),out @list table)
...
...
Рейтинг: 0 / 0
20.06.2005, 11:03
    #33124188
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
Либо через рекодсет (их может быть несколько)
Либо через временную таблицу, которую сама же может создать...
...
Рейтинг: 0 / 0
20.06.2005, 11:28
    #33124236
q
q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
есть табличные функции.
или тут мешанина терминов функции <> процедуры
это вот такая хренотень:

Код: 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.
extern "C"
 void FUNC                         
 (
   <args>

   char          *sqlstate,            /* out: SQLSTATE              */
   char          *fnName,              /* in: family name of function*/
   char          *specificName,        /* in: specific name of func  */
   char          *msgtext,             /* out: diagnostic message    */
   struct scr    *scratchptr,          /* i/o: scratchpad area       */
   long          *callType             /* i/o: call type parameter   */
 )
 {
   strcpy( sqlstate, "00000" );        /* Init sqlstate return var   */
   *msgtext  = NULLCHAR;               /* Init message text rtrn var */
   switch( *callType )
   {
   /*******************************************************************
   * First call:                                                      *
   *******************************************************************/
   case SQLUDF_TF_FIRST:
     scratchptr->lineno =  0 ;           /* Start output line numbering */
     break;
   /*******************************************************************
   * Open call:                                                       *
   *******************************************************************/
   case SQLUDF_TF_OPEN:
     scratchptr->lineno =  0 ;           /* Start output line numbering */
     break;
   /*******************************************************************
   * Fetch calls:                                                     *
   *******************************************************************/
   case SQLUDF_TF_FETCH:
     ....
     if( <last row >)
     {
         strcpy( sqlstate,"02000" );   /* ..signal for FINAL CALL    */
     }
     break;
   /*******************************************************************
   * Close call:                                                      *
   *******************************************************************/
   case SQLUDF_TF_CLOSE:
     break;
   /*******************************************************************
   * Final call:                                                      *
   *******************************************************************/
   default: /* SQLUDF_TF_FINAL */
     break;
   }
   return;
 }
...
Рейтинг: 0 / 0
20.06.2005, 15:31
    #33124919
divp_bot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
gardenmanЛибо через рекодсет (их может быть несколько)
Либо через временную таблицу, которую сама же может создать...
а как обьявляются переменные, есть ли аналог datalength или ссылку на справочник мона? пишу так не получается...
Код: 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.
CREATE FUNCTION TEST(
		@input		VARCHAR (  8000  ),
		@delemiter		VARCHAR (  1  ))
	RETURNS TABLE (
		IDNUM INTEGER, 
		SVALUE VARCHAR (  10  ))
	SPECIFIC TEST
--------------------------------------------------------------------------
-- DB2 SQL function -
--------------------------------------------------------------------------

F1: BEGIN ATOMIC
--
	declare @i int set @i =  1 ;
	declare @code varchar( 20 ) set @code = '';	
	declare @len int set @len = datalength(@input) +  1 ;
	--declare @len int set @len = strlength(@input) + 1;	
	declare @char char( 1 );
	
	while @i < @len begin
		set @char = substring(@input, @i,  1 )
		if @char <> @delimiter
			set @code = @code + @char
		else begin
			insert into test values(@code)
			set @code = ''
		end
		set @i = @i +  1 
	end
	insert into test values(@code)
	delete from test where SVALUE = ''

RETURN SELECT IDNUM, SVALUE FROM TEST;

END
@
-- Grant access privilages to function
GRANT EXECUTE ON  SPECIFIC FUNCTION TEST TO PUBLIC
@
очень нужно, горит!!!
зарание спасибо!
...
Рейтинг: 0 / 0
20.06.2005, 16:20
    #33125067
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
собачки у переменных - убери... этож не SQL server...
туп в форуме поищи "CREATE PROCEDURE" - примерчики найдешь, и еще cookbook тебе в помощь...
...
Рейтинг: 0 / 0
20.06.2005, 16:40
    #33125124
дивп_бот
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
gardenmanсобачки у переменных - убери... этож не SQL server...
туп в форуме поищи "CREATE PROCEDURE" - примерчики найдешь, и еще cookbook тебе в помощь...
и на том спасибо... кукбук мне уже дали :) буду посматреть...
а так на вскидку не скажете на счет datalength есть она в db2 ну или аналог? спасибо!
...
Рейтинг: 0 / 0
20.06.2005, 16:44
    #33125131
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
db2 => connect to test

   Database Connection Information

 Database server        = DB2/NT  8 . 2 . 0 
 SQL authorization ID   = DB2ADMIN
 Local database alias   = TEST

db2 => values length('1234567890')

 1 
-----------
          10 

   1  record(s) selected.

db2 =>
...
Рейтинг: 0 / 0
21.06.2005, 15:40
    #33127025
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
спасибо, начинаю вьезжать :) но можно спец. для тех кто в танке
как мне обраться к возвращаемой таблице чтобы заполнить ее? нужно ли создавать временную, если да то зачем?
Код: 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.
CREATE FUNCTION DB2ADMIN.GETSPLIT(v_text VARCHAR( 8000 ),
                                   v_delimiter VARCHAR( 1 ) )
    RETURNS TABLE (numid INTEGER, svalue VARCHAR( 10 ))
    SPECIFIC DB2ADMIN.GETSPLIT
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN ATOMIC
DECLARE v_i int DEFAULT  1 ;
DECLARE v_code varchar( 20 ) DEFAULT '';
DECLARE v_len int DEFAULT  0 ;
DECLARE v_char char( 1 );

SET v_len = length(v_text) +  1 ;

WHILE v_i < v_len DO
     SET v_char = substr(v_text, v_i,  1 );
     IF v_char <> v_delimiter
     THEN
        SET v_code = concat(v_code, v_char);
     ELSE
        --INSERT INTO в возвр. таб. как?
        SET v_code = '';
     END IF;
        SET v_i = v_i +  1 ;
END WHILE;
--INSERT INTO в возвр. таб. как?
--delete from возвр. таб. как?
--RETURN что?;
END

...
Рейтинг: 0 / 0
21.06.2005, 16:01
    #33127097
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
http://www.sql.ru/forum/actualthread.aspx?tid=179429&hl=locator#1499443

Это если нужно много рекрдсетов возвращать.
А в противном случае лучше просто создать табличную функцию.



http://publib.boulder.ibm.com/infocenter/db2help/topic/com.ibm.db2.udb.doc/admin/r0003493.htm
...
Рейтинг: 0 / 0
21.06.2005, 16:38
    #33127233
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
блин кто-то очень плотно закрыл все люки :)
мне нужно что-то типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE FUNCTION DEPTEMPLOYEES (DEPTNO CHAR( 3 ))
     RETURNS TABLE (EMPNO CHAR( 6 ),
                    LASTNAME VARCHAR( 15 ),
                    FIRSTNAME VARCHAR( 12 ))
     LANGUAGE SQL
     READS SQL DATA
     NO EXTERNAL ACTION
     DETERMINISTIC
     RETURN
       SELECT EMPNO, LASTNAME, FIRSTNME
         FROM EMPLOYEE
         WHERE EMPLOYEE.WORKDEPT = DEPTEMPLOYEES.DEPTNO 
но нужно сначало запихать данные в эту возращаемую таблицу (распарсить строку) а потом вытащить
пример Split('blablabla', 'a')
result
idnum svalue
1 bl
2 bl
3 bl
так нужно создавать временную таблицу в самой функции и пехать туда данные или нет? вообще не доганяяю :(
...
Рейтинг: 0 / 0
21.06.2005, 17:24
    #33127386
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
Ну вот же пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE FUNCTION  DEPTEMPLOYEES (DEPTNO CHAR( 3 ))
      RETURNS TABLE  (EMPNO CHAR( 6 ),
                     LASTNAME VARCHAR( 15 ),
                     FIRSTNAME VARCHAR( 12 ))
      LANGUAGE SQL
      MODIFIES SQL DATA
      NO EXTERNAL ACTION
      DETERMINISTIC
BEGIN ATOMIC
        -- типа от сих пор 
           INSERT INTO  AUDIT 
           VALUES  ( USER , 
                'Table: EMPLOYEE Prd: DEPTNO = ' || DEPTNO);
        -- и до сих пор делаем чё нада
        -- и возвращаем...
        RETURN
          SELECT  EMPNO, LASTNAME, FIRSTNME
            FROM  EMPLOYEE
            WHERE  EMPLOYEE.WORKDEPT = DEPTEMPLOYEES.DEPTNO
END  
...
Рейтинг: 0 / 0
21.06.2005, 17:53
    #33127481
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
gardenmanНу вот же пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE FUNCTION  DEPTEMPLOYEES (DEPTNO CHAR( 3 ))
      RETURNS TABLE  (EMPNO CHAR( 6 ),
                     LASTNAME VARCHAR( 15 ),
                     FIRSTNAME VARCHAR( 12 ))
      LANGUAGE SQL
      MODIFIES SQL DATA
      NO EXTERNAL ACTION
      DETERMINISTIC
BEGIN ATOMIC
        -- типа от сих пор 
           INSERT INTO  AUDIT 
           VALUES  ( USER , 
                'Table: EMPLOYEE Prd: DEPTNO = ' || DEPTNO);
        -- и до сих пор делаем чё нада
        -- и возвращаем...
        RETURN
          SELECT  EMPNO, LASTNAME, FIRSTNME
            FROM  EMPLOYEE
            WHERE  EMPLOYEE.WORKDEPT = DEPTEMPLOYEES.DEPTNO
END  

мм да похоже дело труба :(
можно подробнее что такое AUDIT? физически сущю табл. в которую записывают записи?
и еще можно расшифровать это:
Код: plaintext
1.
( USER , 'Table: EMPLOYEE Prd: DEPTNO = ' || DEPTNO);
...
Рейтинг: 0 / 0
21.06.2005, 18:05
    #33127514
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
распарсить строку - это можно сделать рекурсивно оператором WITH
или - написать C/C++ табличную ф-цию... там можно чё угодно сделать... и работать будет - реактивно...
AUDIT - действительно - таблица
|| - оператор конкатенации строк...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
db2 => values 'ku' || '-' || 'ku'

 1 
-----
ku-ku

   1  record(s) selected.

db2 =>
...
Рейтинг: 0 / 0
21.06.2005, 18:19
    #33127553
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
gardenmanраспарсить строку - это можно сделать рекурсивно оператором WITH
или - написать C/C++ табличную ф-цию... там можно чё угодно сделать... и работать будет - реактивно...
AUDIT - действительно - таблица
|| - оператор конкатенации строк...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
db2 => values 'ku' || '-' || 'ku'

 1 
-----
ku-ku

   1  record(s) selected.

db2 =>


огромное спасибо за ответы и помощь.
так я вроде так и парсю :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WHILE v_i < v_len DO
     SET v_char = substr(v_text, v_i,  1 );
     IF v_char <> v_delimiter
     THEN
        SET v_code = concat(v_code, v_char);
     ELSE
        --INSERT INTO TEMPTABLE VALUES(v_code);
        --как мне
        SET v_code = '';
     END IF;
        SET v_i = v_i +  1 ;
END WHILE;              
не понятно 2 вещи как создать временную таблицу (нужно ли)?
задать значение поле id временной таблицы TEMPTABLE в AUTONUMBER?
...
Рейтинг: 0 / 0
22.06.2005, 09:49
    #33128135
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
Насколько мне известно - с временными таблицами (в полном понимании этого слова) в UDF работать нельльзя:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
db2 => ? SQL0526N
SQL0526N The requested function does not apply to declared
          temporary tables.

Explanation:

The SQL statement being executed refers to a declared temporary
table. A declared temporary table cannot be used in the given
context.

 The statement cannot be processed.

User Response:

Modify the SQL statement to ensure that the object references are
not to declared temporary tables.

 sqlcode :  - 526 

 sqlstate :   42995 

db2 =>

поэтому есть варианты:
1) это должна быть не ф-ция, а процедура
2) это должна быть табличная ф-ция написанная на С/С++
3) это д.б. табличная ф-ция заканчивающаяся full-select

На счет автонумерации - рассмотрите варианты:
1) рекурсивная нумерация прямо в запросе
2) поищите тут по форуму ф-цию counter - реализацию на С/С++ - в жизни пригодится
3) рассмотрите SEQUENCE, IDENTITY, ROW_NUMBER() OVER()
...
Рейтинг: 0 / 0
22.06.2005, 17:14
    #33129575
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
может я понимаю не верно значение временной табл....
однако можно ли сделать так:
в UDF с возвращаемым типом "Таблица" распарсить строку (входной параметр)и вернуть ее той же UDF но в табличном виде

входные пар.
Split('blablabla', 'a')

результат
id value
1 bl
2 bl
3 bl
...
Рейтинг: 0 / 0
22.06.2005, 18:00
    #33129727
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
если бы удастся построить по результату парсинга и запустить на выполнение в теле функции такой вот select
ith tmp (id, name) as (values (1,'a'),(2,'b'),(3,'c')) select * from tmp
то будет получен искомый результат
...
Рейтинг: 0 / 0
22.06.2005, 18:01
    #33129730
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
"with tmp ..."
- очепятка была
...
Рейтинг: 0 / 0
22.06.2005, 18:14
    #33129766
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
блин я нифига не понимаю можно подробнее?
...
Рейтинг: 0 / 0
22.06.2005, 18:31
    #33129800
divp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
если иметтся в виду tmp - временная таблица то дакларация такого вида
Код: plaintext
1.
2.
DECLARE GLOBAL TEMPORARY TABLE SESSION.LIST(ID_NUM INTEGER, V_VALUE VARCHAR( 10 ))
WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;
не прокатывает в UDF :(
да и мне не понять одну вещь, если функция возвращает таблицу то почему нельзя заполнить эту таблицу в самой функции? если можно заполнить то по какому имени к ней обратиться?
...
Рейтинг: 0 / 0
23.06.2005, 09:58
    #33130390
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
ggv прав.
Между прочим если взять любимый наш COOKBOOK то там есть пример как это делается. Мой Вам совет - скачайте COOKBOOK - и не пуха вам ни пера!

http://ourworld.compuserve.com/homepages/graeme_birchall/DB2V82CK.PDF
...
Рейтинг: 0 / 0
23.06.2005, 18:13
    #33132042
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
User defined functions
я бы взял файл udfemsrv.sqc из samples за основу,
man strchr или man strtok,
в теле функции парсишь и строишь динамический запрос с этим, как его, забыл официальное название, ну короче с предложением WITH, который возвращает - короче, запусти на выполнение
with tmp (id, name) as (values (1,'a'),(2,'b'),(3,'c')) select * from tmp;
и увидишь
вот это функция и должна возвратить.
а построить тело запроса и есть твоя задача.
gardenman - а где там в cookbook'e похожий пример, не ткнёш носом?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / User defined functions / 25 сообщений из 33, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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