powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Размножение рекордсов в DB 2
7 сообщений из 7, страница 1 из 1
Размножение рекордсов в DB 2
    #33052536
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Какой драйвер используют при экспорте БД из SQL Server в DB2 и возможно ли это вообще?
Может существует какие-то определенные методы для экспорта БД больших размеров (100 000 000 рекордс) из SQL Server в DB2?

Я - новичок в DB2. Работала только с SQL Server. Нужно размножить 1000 рекордсов до 100 000 000 рекордсов. Запустила в Comand editor (Версия 8.2)
следующий одиночный batch:

INSERT INTO TableName SELECT * from TableName FETCH FIRST 1000 ROWS ONLY;

Работает. Но для получения 100 000 000 рекордсов необходимо написать цикл, а значит compound batch, т.е. состоящий из нескольких statements, разделенных ; . А как я понимаю, такой compound batch нужно куда-то вставить, например в stored procedure. Тогда вопрос , где писать и запускать stored procedure?

Для начала, скажем, хотела посмотреть как работает простейший, написанный в SQL Server:

DECLARE @step INT
SET @step = 1000
PRINT 'my step is' + CONVERT(VARCHAR(20), @step)

Как такой batch будет выглядеть в DB2 и где и как его запустить?

Буду неоценимо признательна за совет
Мой емеил - lenarodo@hotmail.com
...
Рейтинг: 0 / 0
Размножение рекордсов в DB 2
    #33052871
nkulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проще написать хранимую процедуру, только коммиты выставлять пореже не каждую строчку.

Можно взять за отдельные деньги tools DB2 Generator который тебе по шаблонам чего хочешь нагенерит.

Потом можешь взять DB2 Cookbook там есть примеры по генерации таблиц.

например cкрипт генерящий 10000 сотрудников. Если тебе нужно больше пишешь
хранимую процедуру которая 10000 раз выполняет подобный запрос.

Код: 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.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
CREATE TABLE personnel
(emp# INTEGER NOT NULL
,socsec# CHAR( 11 ) NOT NULL
,job_ftn CHAR( 4 ) NOT NULL
,dept SMALLINT NOT NULL
,salary DECIMAL( 7 , 2 ) NOT NULL
,date_bn DATE NOT NULL WITH DEFAULT
,fst_name VARCHAR( 20 )
,lst_name VARCHAR( 20 )
,CONSTRAINT pex1 PRIMARY KEY (emp#)
,CONSTRAINT pe01 CHECK (emp# >  0 )
,CONSTRAINT pe02 CHECK (LOCATE('',socsec#) =  0 )
,CONSTRAINT pe03 CHECK (LOCATE('-',socsec#, 1 ) =  4 )
,CONSTRAINT pe04 CHECK (LOCATE('-',socsec#, 5 ) =  7 )
,CONSTRAINT pe05 CHECK (job_ftn <> '')
,CONSTRAINT pe06 CHECK (dept BETWEEN  1  AND  99 )
,CONSTRAINT pe07 CHECK (salary BETWEEN  0  AND  99999 )
,CONSTRAINT pe08 CHECK (fst_name <> '')
,CONSTRAINT pe09 CHECK (lst_name <> '')
,CONSTRAINT pe10 CHECK (date_bn >= '1900-01-01' ));
COMMIT;
CREATE UNIQUE INDEX PEX2 ON PERSONNEL (SOCSEC#);
CREATE UNIQUE INDEX PEX3 ON PERSONNEL (DEPT, EMP#);
COMMIT;


INSERT INTO personnel
WITH temp1 (s1,r1,r2,r3,r4) AS
(VALUES ( 0 
,RAND( 2 )
,RAND()+(RAND()/1E5)
,RAND()* RAND()
,RAND()* RAND()* RAND())
UNION ALL
SELECT s1 +  1 
,RAND()
,RAND()+(RAND()/1E5)
,RAND()* RAND()
,RAND()* RAND()* RAND()
FROM temp1
WHERE s1 <  10000 
)
SELECT  100000  + s1
,SUBSTR(DIGITS(INT(r2* 988 + 10 )), 8 ) || '-' ||
SUBSTR(DIGITS(INT(r1* 88 + 10 )), 9 ) || '-' ||
TRANSLATE(SUBSTR(DIGITS(s1), 7 ),'9873450126','0123456789')
,CASE
WHEN INT(r4* 9 ) >  7  THEN 'MGR'
WHEN INT(r4* 9 ) >  5  THEN 'SUPR'
WHEN INT(r4* 9 ) >  3  THEN 'PGMR'
WHEN INT(R4* 9 ) >  1  THEN 'SEC'
ELSE 'WKR'
END
,INT(r3* 98 + 1 )
,DECIMAL(r4* 99999 , 7 , 2 )
,DATE('1930-01-01') + INT( 50 -(r4* 50 )) YEARS
+ INT(r4* 11 ) MONTHS
+ INT(r4* 27 ) DAYS
,CHR(INT(r1* 26 + 65 ))|| CHR(INT(r2* 26 + 97 ))|| CHR(INT(r3* 26 + 97 ))||
CHR(INT(r4* 26 + 97 ))|| CHR(INT(r3* 10 + 97 ))|| CHR(INT(r3* 11 + 97 ))
,CHR(INT(r2* 26 + 65 ))||
TRANSLATE(CHAR(INT(r2*1E7)),'aaeeiibmty','0123456789')
FROM temp1;

...
Рейтинг: 0 / 0
Размножение рекордсов в DB 2
    #33053294
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если нужно просто тестовыми данными заполнить балшую табличку
то просто
1) создаем такую табличу,
2) отключаем логгирование по табличке
3) вставляем кучу записей... хоть мульен...
PS. db2 -c- чтобы отключить автокоммит

Код: 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 table test (
   name char( 10 ),
   dt date 
) @

alter table test activate not logged initially

insert into table
with tmp(id) as (
   values ( 1 )
union all
   select 
      id+ 1 
   from tmp
      where id< 10000000 
) select
  chr( 65 +int(rand()* 26 ))|| /* тут генерятся буквы англицкого алфавита */
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 )),
  current date + int(rand()* 365 ) days /* генерятся даты в пределах 1 года */
from tmp
@
commit@
...
Рейтинг: 0 / 0
Размножение рекордсов в DB 2
    #33053667
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanесли нужно просто тестовыми данными заполнить балшую табличку
то просто
1) создаем такую табличу,
2) отключаем логгирование по табличке
3) вставляем кучу записей... хоть мульен...
PS. db2 -c- чтобы отключить автокоммит

Код: 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 table test (
   name char( 10 ),
   dt date 
) @

alter table test activate not logged initially

insert into table
with tmp(id) as (
   values ( 1 )
union all
   select 
      id+ 1 
   from tmp
      where id< 10000000 
) select
  chr( 65 +int(rand()* 26 ))|| /* тут генерятся буквы англицкого алфавита */
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 ))||
  chr( 65 +int(rand()* 26 )),
  current date + int(rand()* 365 ) days /* генерятся даты в пределах 1 года */
from tmp
@
commit@



------------------------------------
Спасибки, только пролейте свет на выражение: "отключаем логгирование по табличке". Для чего это нужно делать?

А где пишутся процедуры и как запустить?

Как будут выглядеть эти простые, безобидные строки для DB2, на которые он так жестоко ругается?

DECLARE @step INT
SET @step = 1000
PRINT 'my step is' + CONVERT(VARCHAR(20), @step)
...
Рейтинг: 0 / 0
Размножение рекордсов в DB 2
    #33053752
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отключаем логгирование чтобы уменьшить I/O, и чтобы лог при такой длинной транзакции не переполнился, это делается так:
alter table <имя таблички> activate not logged initially
это будет действовать в течение одной транзакции до первого commit
А простейшая процедура будет выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
-- файл test.sql
create procedure testproc (in a integer, out b integer)
language sql
begin
   declare m integer default  10 ;
   set b=m*a;
end
@
commit@
call testproc( 10 ,?)@
запускаем:
db2 -c- -td@ -f test.sql

получаем:
[SQL]
Database Connection Information

Database server = DB2/NT 8.2.0
SQL authorization ID = DB2ADMIN
Local database alias = TEST


DB20000I The SQL command completed successfully.

DB20000I The SQL command completed successfully.


Value of output parameters
--------------------------
Parameter Name : B
Parameter Value : 100

Return Status = 0
[/SQL]

что касается оператора print - то такого нет в DB2
если хотите что-то вывести в таком роде - то создавайте временную таблицу в процедуре, заполняйте ее данными, открывайте по ней курсор и возвращайте
recordset

а вообще - самая классная книжка по этим примитивным фичам - DB2 COOKBOOK. вам про это сказали. И, чесслово, у меня нет особого желания дублировать документацию IBM. И, короче, не ищите те вещи и те прибамбасы, которые есть в MSSQL и Sybase. Все-таки это разные базы.

Да, и еще, поищите в "Сравнении БД" топик по поводу временных таблиц.
Удачи!
...
Рейтинг: 0 / 0
Размножение рекордсов в DB 2
    #33054559
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanотключаем логгирование чтобы уменьшить I/O, и чтобы лог при такой длинной транзакции не переполнился, это делается так:
alter table <имя таблички> activate not logged initially
это будет действовать в течение одной транзакции до первого commit
А простейшая процедура будет выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
-- файл test.sql
create procedure testproc (in a integer, out b integer)
language sql
begin
   declare m integer default  10 ;
   set b=m*a;
end
@
commit@
call testproc( 10 ,?)@
запускаем:
db2 -c- -td@ -f test.sql

получаем:
[SQL]
Database Connection Information

Database server = DB2/NT 8.2.0
SQL authorization ID = DB2ADMIN
Local database alias = TEST


DB20000I The SQL command completed successfully.

DB20000I The SQL command completed successfully.


Value of output parameters
--------------------------
Parameter Name : B
Parameter Value : 100

Return Status = 0
[/SQL]

что касается оператора print - то такого нет в DB2
если хотите что-то вывести в таком роде - то создавайте временную таблицу в процедуре, заполняйте ее данными, открывайте по ней курсор и возвращайте
recordset

а вообще - самая классная книжка по этим примитивным фичам - DB2 COOKBOOK. вам про это сказали. И, чесслово, у меня нет особого желания дублировать документацию IBM. И, короче, не ищите те вещи и те прибамбасы, которые есть в MSSQL и Sybase. Все-таки это разные базы.

Да, и еще, поищите в "Сравнении БД" топик по поводу временных таблиц.
Удачи!

--------------------------
Запустила простеишую процедуру со следующим результатом:

Fix the problem and retry. This could involve catalog access, a
change to the statement, a grant of the execute privilege to the
routine invoker, the addition of new functions, and/or a change
to the SQL path.
sqlcode : -440

sqlstate : 42884


Мой user- db2admin вроде имеет все привелегии
...
Рейтинг: 0 / 0
Размножение рекордсов в DB 2
    #33055520
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
откройте Control Center, посмотрите в какой схеме создана процедура.
Очевидно вы не в той схеме ее создали. Вводите квалифицированное имя для вызова процедуры.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Размножение рекордсов в DB 2
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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