powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запросик?
25 сообщений из 45, страница 1 из 2
Запросик?
    #32827162
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ! Подкиньте идейку, плз...
Хочу сформировать следующую временную таблицу:
есть некая таблица(абсолютно любая), мне надо ее полностью загнать во временную, только во временной должен добавиться еще один столбец, который заполняется как идентификатор самой DB2...
Такое вообще возможно?
...
Рейтинг: 0 / 0
Запросик?
    #32827178
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
см CREATE SEQUENCE...
см ROW_NUMBER() OVER(ORDER BY)
также можешь сам написать NOT DETERMINISTIC функцию на С++
...
Рейтинг: 0 / 0
Запросик?
    #32827181
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ах да... GENERATE_UNIQUE()
...
Рейтинг: 0 / 0
Запросик?
    #32827183
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как раз от rownumber пытаюсь избавиться....:)
...
Рейтинг: 0 / 0
Запросик?
    #32827189
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен целочисленный идентификатор....:(
...
Рейтинг: 0 / 0
Запросик?
    #32827195
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен целочисленный идентификатор....:(
...
Рейтинг: 0 / 0
Запросик?
    #32827219
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE SEQUENCE это про что?
...
Рейтинг: 0 / 0
Запросик?
    #32827232
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А IDENTITY смотрел?
...
Рейтинг: 0 / 0
Запросик?
    #32827255
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пытаюсь с IDENTITY завязаться... Млин, туплю, не могу insert во временную сделать, чтобы это идентификатор сам формировался...
Как енто делается-то?
...
Рейтинг: 0 / 0
Запросик?
    #32827264
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут еще проблема... Как объявить IDENTITY столбец вовременной, если я не знаю структуру базовой(она может быть произвольной...)...
...
Рейтинг: 0 / 0
Запросик?
    #32827271
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Your last chance - NOT DETERMINISTIC C++ FUNCTION :)
...
Рейтинг: 0 / 0
Запросик?
    #32827700
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDENTITY в GLOBAL TEMPORARY не катит по крайней мере в v 7.2 for Win. Чем тебе ROW_NUMBER() не угодил?
...
Рейтинг: 0 / 0
Запросик?
    #32827782
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
SEQUENCE looks like the simplest solution
...
Рейтинг: 0 / 0
Запросик?
    #32827947
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rownumber() не катит, потому что на больших списках (~50000) его уже начинаешь ощущать:(
...
Рейтинг: 0 / 0
Запросик?
    #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
Запросик?
    #32829906
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пока сделал через промежуточную временную таблицу... Производительность на 1/3 увеличилась по сравнению с RowNumber()...
Попробую создать функцию...
...
Рейтинг: 0 / 0
Запросик?
    #32829916
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда убедишься что все хорошо работает, можешь сделать функцию NOT FENCED. Тогда скорость ее работы увеличится раза в 2.
...
Рейтинг: 0 / 0
Запросик?
    #32829985
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего-то не могу функцию собрать:(
Пишет:
Waiting ....
NMAKE : fatal error U1077: 'C:\PROGRA~1\sqllib\bin\db2clpex' : return code '0x1'
Stop.
...
Рейтинг: 0 / 0
Запросик?
    #32830040
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хочешь я тебе упакую всё и вышлю на почту...
counter.dll подложишь в SQLLIB\FUNCTION\, зарегистрируешь функцию и попробуешь всё
...
Рейтинг: 0 / 0
Запросик?
    #32830048
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
db2clpex.exe - для того, чтобы компилиться без db2cmd.exe
В сущности, можешь его удалить, если работаешь из-под db2cmd.
...
Рейтинг: 0 / 0
Запросик?
    #32830049
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это конечно было бы здорово... tort@inbox.ru
Тока хотелось бы разобраться, чего за фиХня происходит...
В общем доходит до db2clpex, потом немного думает и все....
Чего бы это значило?
...
Рейтинг: 0 / 0
Запросик?
    #32830177
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХМ... Скорость примерно такая же, как у меня....
...
Рейтинг: 0 / 0
Запросик?
    #32830185
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а с NOT FENCED пробовал?
...
Рейтинг: 0 / 0
Запросик?
    #32830190
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот с NOT FENCED похоже быстрее....
...
Рейтинг: 0 / 0
Запросик?
    #32830198
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может быть время срабатывания counter пренебрежительно мало по сравнению с общим вводом-выводом и поэтому тормоза совсем не в этом месте?
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запросик?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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