Гость
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запросик? / 25 сообщений из 45, страница 1 из 2
14.12.2004, 16:44
    #32827162
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Народ! Подкиньте идейку, плз...
Хочу сформировать следующую временную таблицу:
есть некая таблица(абсолютно любая), мне надо ее полностью загнать во временную, только во временной должен добавиться еще один столбец, который заполняется как идентификатор самой DB2...
Такое вообще возможно?
...
Рейтинг: 0 / 0
14.12.2004, 16:49
    #32827178
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
см CREATE SEQUENCE...
см ROW_NUMBER() OVER(ORDER BY)
также можешь сам написать NOT DETERMINISTIC функцию на С++
...
Рейтинг: 0 / 0
14.12.2004, 16:50
    #32827181
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
ах да... GENERATE_UNIQUE()
...
Рейтинг: 0 / 0
14.12.2004, 16:50
    #32827183
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Вот как раз от rownumber пытаюсь избавиться....:)
...
Рейтинг: 0 / 0
14.12.2004, 16:52
    #32827189
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Нужен целочисленный идентификатор....:(
...
Рейтинг: 0 / 0
14.12.2004, 16:54
    #32827195
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Нужен целочисленный идентификатор....:(
...
Рейтинг: 0 / 0
14.12.2004, 17:02
    #32827219
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
CREATE SEQUENCE это про что?
...
Рейтинг: 0 / 0
14.12.2004, 17:06
    #32827232
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
А IDENTITY смотрел?
...
Рейтинг: 0 / 0
14.12.2004, 17:17
    #32827255
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Вот пытаюсь с IDENTITY завязаться... Млин, туплю, не могу insert во временную сделать, чтобы это идентификатор сам формировался...
Как енто делается-то?
...
Рейтинг: 0 / 0
14.12.2004, 17:19
    #32827264
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Тут еще проблема... Как объявить IDENTITY столбец вовременной, если я не знаю структуру базовой(она может быть произвольной...)...
...
Рейтинг: 0 / 0
14.12.2004, 17:25
    #32827271
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Your last chance - NOT DETERMINISTIC C++ FUNCTION :)
...
Рейтинг: 0 / 0
15.12.2004, 05:45
    #32827700
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
IDENTITY в GLOBAL TEMPORARY не катит по крайней мере в v 7.2 for Win. Чем тебе ROW_NUMBER() не угодил?
...
Рейтинг: 0 / 0
15.12.2004, 08:38
    #32827782
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
SEQUENCE looks like the simplest solution
...
Рейтинг: 0 / 0
15.12.2004, 10:46
    #32827947
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Rownumber() не катит, потому что на больших списках (~50000) его уже начинаешь ощущать:(
...
Рейтинг: 0 / 0
16.12.2004, 10:39
    #32829757
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
makefile
Код: 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.
DBUSER=db2admin
DBNAME=test
DBPASSWORD=ibmdb2

TARGET=counter.dll
DEF=counter.def
LIBS=db2api.lib

CPPOBJS= counter.obj
CFLAGS= -Z7 -O2 -G5 -c -W2 -D_X86_= 1  -DWIN32 -GR -GX
LINKFLAGS= /DEBUG /DLL

.SUFFIXES:
.SUFFIXES: .obj .sqx .cpp

.cpp.obj:
	cl $(CFLAGS) $*.cpp

.sqx.obj:
	echo CONNECT TO $(DBNAME) USER $(DBUSER) USING '$(DBPASSWORD)' > $*.db2
	echo PREP $*.sqx BINDFILE >> $*.db2
	echo BIND $*.bnd >> $*.db2
    @if exist $*.log del $*.log
    d:\sqllib\bin\db2clpex db2 -z $*.log -vf $*.db2
    type $*.log
	cl $(CFLAGS) $*.cxx

$(TARGET): $(CPPOBJS) Makefile $(DEF)
	link $(LINKFLAGS) -out:$(TARGET) $(SQXOBJS) $(CPPOBJS) $(LIBS) -def:$(DEF)
    copy $(TARGET) d:\sqllib\function

counter.def
Код: plaintext
1.
2.
LIBRARY counter
EXPORTS counter

counter.sqx

Код: 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.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sql.h>
#include <sqludf.h>


SQL_API_RC SQL_API_FN counter (
		SQLUDF_INTEGER *pIncrement,			//Входящее значение
		SQLUDF_INTEGER *pReturn,			//Возвращаемое значение
		SQLUDF_NULLIND *pIncrement_ind,		//NULL - индикатор для инкремента
		SQLUDF_NULLIND *pReturn_ind,		//NULL - индикатор для возвращаемой величины
		SQLUDF_TRAIL_ARGS_ALL
    )
{
    //По умолчанию размер scratchpad = 100  байт
    //Функция работает очень просто. В случае, если 
    //входящее значение - NULL, то счетчик сбрасывается в  0 
    //в противном случае значение счетчика увеличивается на 
    //значение переданное в параметре
    //Значение счетчика резидентно хранится в области
    //SCRATCHPAD размер которого задается оператором CREATE FUNCTION
    //на время выполнения SQL-запроса
    //и по умолчанию запоняется нулями
    //область SCRATCHPAD инициализируется для каждого
    //упоминания counter в SQL-запросе

    (*((long*)(SQLUDF_SCRAT->data)))=(*((long*)(SQLUDF_SCRAT->data)))+(*pIncrement);
    (*pReturn)=(*((long*)(SQLUDF_SCRAT->data)));    
    return  0 ;
}

counter.sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
connect reset@
connect to test@

drop function counter(integer)@

create function counter(cnt integer)
returns integer
external name 'counter!counter'	
language c
parameter style sql
not deterministic
fenced threadsafe
called on null input
no sql
no external action
scratchpad
disallow parallel
@
commit@

test.sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
connect to test@

with tmp (id) as
( values ( 1 )
  union all
     select tmp.id+ 1  from tmp
     where tmp.id < 10 
)
select tmp.*, 10 -counter( 2 ),counter( 1 ),counter( 5 ) from tmp@

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

   Информация соединения с базой данных

 Сервер баз данных           = DB2/NT  8 . 2 . 0 
 ID авторизации SQL          = DB2ADMIN
 Алиас локальной базы данных = TEST


with tmp (id) as ( values ( 1 ) union all select tmp.id+ 1  from tmp where tmp.id < 10  ) select tmp.*, 10 -counter( 2 ),counter( 1 ),counter( 5 ) from tmp

ID           2             3             4           
----------- ----------- ----------- -----------
           1             8             1             5 
           2             6             2            10 
           3             4             3            15 
           4             2             4            20 
           5             0             5            25 
           6           - 2             6            30 
           7           - 4             7            35 
           8           - 6             8            40 
           9           - 8             9            45 
          10          - 10            10            50 

   10  записей выбрано.


так пойдет?...
...
Рейтинг: 0 / 0
16.12.2004, 11:34
    #32829906
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Я пока сделал через промежуточную временную таблицу... Производительность на 1/3 увеличилась по сравнению с RowNumber()...
Попробую создать функцию...
...
Рейтинг: 0 / 0
16.12.2004, 11:37
    #32829916
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
когда убедишься что все хорошо работает, можешь сделать функцию NOT FENCED. Тогда скорость ее работы увеличится раза в 2.
...
Рейтинг: 0 / 0
16.12.2004, 12:06
    #32829985
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Чего-то не могу функцию собрать:(
Пишет:
Waiting ....
NMAKE : fatal error U1077: 'C:\PROGRA~1\sqllib\bin\db2clpex' : return code '0x1'
Stop.
...
Рейтинг: 0 / 0
16.12.2004, 12:25
    #32830040
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
если хочешь я тебе упакую всё и вышлю на почту...
counter.dll подложишь в SQLLIB\FUNCTION\, зарегистрируешь функцию и попробуешь всё
...
Рейтинг: 0 / 0
16.12.2004, 12:28
    #32830048
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
db2clpex.exe - для того, чтобы компилиться без db2cmd.exe
В сущности, можешь его удалить, если работаешь из-под db2cmd.
...
Рейтинг: 0 / 0
16.12.2004, 12:28
    #32830049
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
Это конечно было бы здорово... tort@inbox.ru
Тока хотелось бы разобраться, чего за фиХня происходит...
В общем доходит до db2clpex, потом немного думает и все....
Чего бы это значило?
...
Рейтинг: 0 / 0
16.12.2004, 13:10
    #32830177
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
ХМ... Скорость примерно такая же, как у меня....
...
Рейтинг: 0 / 0
16.12.2004, 13:12
    #32830185
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
а с NOT FENCED пробовал?
...
Рейтинг: 0 / 0
16.12.2004, 13:13
    #32830190
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
А вот с NOT FENCED похоже быстрее....
...
Рейтинг: 0 / 0
16.12.2004, 13:14
    #32830198
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик?
может быть время срабатывания counter пренебрежительно мало по сравнению с общим вводом-выводом и поэтому тормоза совсем не в этом месте?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запросик? / 25 сообщений из 45, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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