powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / User defined functions
25 сообщений из 33, страница 1 из 2
User defined functions
    #33120658
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как запускать чтобы проверить результат?
...
Рейтинг: 0 / 0
User defined functions
    #33121013
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запускать - просто в 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
User defined functions
    #33123183
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. А есть ли тип данных table? Что-то я не нашел в хелпе...
...
Рейтинг: 0 / 0
User defined functions
    #33123206
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
м да спросил :) вернее может ли UDF возвратить данные в таблице?
что-то типа
Код: plaintext
1.
2.
create procedure Split (in @input text, in @delimiter varchar( 1 ),out @list table)
...
...
Рейтинг: 0 / 0
User defined functions
    #33124188
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо через рекодсет (их может быть несколько)
Либо через временную таблицу, которую сама же может создать...
...
Рейтинг: 0 / 0
User defined functions
    #33124236
q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
q
Гость
есть табличные функции.
или тут мешанина терминов функции <> процедуры
это вот такая хренотень:

Код: 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
User defined functions
    #33124919
divp_bot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
User defined functions
    #33125067
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собачки у переменных - убери... этож не SQL server...
туп в форуме поищи "CREATE PROCEDURE" - примерчики найдешь, и еще cookbook тебе в помощь...
...
Рейтинг: 0 / 0
User defined functions
    #33125124
дивп_бот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanсобачки у переменных - убери... этож не SQL server...
туп в форуме поищи "CREATE PROCEDURE" - примерчики найдешь, и еще cookbook тебе в помощь...
и на том спасибо... кукбук мне уже дали :) буду посматреть...
а так на вскидку не скажете на счет datalength есть она в db2 ну или аналог? спасибо!
...
Рейтинг: 0 / 0
User defined functions
    #33125131
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
User defined functions
    #33127025
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, начинаю вьезжать :) но можно спец. для тех кто в танке
как мне обраться к возвращаемой таблице чтобы заполнить ее? нужно ли создавать временную, если да то зачем?
Код: 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
User defined functions
    #33127097
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
User defined functions
    #33127233
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
блин кто-то очень плотно закрыл все люки :)
мне нужно что-то типа
Код: 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
User defined functions
    #33127386
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  
...
Рейтинг: 0 / 0
User defined functions
    #33127481
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
User defined functions
    #33127514
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 =>
...
Рейтинг: 0 / 0
User defined functions
    #33127553
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
User defined functions
    #33128135
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько мне известно - с временными таблицами (в полном понимании этого слова) в 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
User defined functions
    #33129575
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может я понимаю не верно значение временной табл....
однако можно ли сделать так:
в UDF с возвращаемым типом "Таблица" распарсить строку (входной параметр)и вернуть ее той же UDF но в табличном виде

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

результат
id value
1 bl
2 bl
3 bl
...
Рейтинг: 0 / 0
User defined functions
    #33129727
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
если бы удастся построить по результату парсинга и запустить на выполнение в теле функции такой вот select
ith tmp (id, name) as (values (1,'a'),(2,'b'),(3,'c')) select * from tmp
то будет получен искомый результат
...
Рейтинг: 0 / 0
User defined functions
    #33129730
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
"with tmp ..."
- очепятка была
...
Рейтинг: 0 / 0
User defined functions
    #33129766
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
блин я нифига не понимаю можно подробнее?
...
Рейтинг: 0 / 0
User defined functions
    #33129800
divp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если иметтся в виду 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
User defined functions
    #33130390
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggv прав.
Между прочим если взять любимый наш COOKBOOK то там есть пример как это делается. Мой Вам совет - скачайте COOKBOOK - и не пуха вам ни пера!

http://ourworld.compuserve.com/homepages/graeme_birchall/DB2V82CK.PDF
...
Рейтинг: 0 / 0
User defined functions
    #33132042
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
я бы взял файл 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
25 сообщений из 33, страница 1 из 2
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / User defined functions
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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