powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Compound batch вообще возможен или только Stored Procedure ?
6 сообщений из 6, страница 1 из 1
Compound batch вообще возможен или только Stored Procedure ?
    #33054654
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица a(aid integer, atext varchar).

В неи - 5 строк с данными.
Необходимо получить 5 раз по 5 строк с такими же данными, но id должен быть на 2 больше, чем в исходных строках
На такой код он непонятно ругается

DECLARE cntr INTEGER DEFAULT 2
@
INSERT INTO a (AID, ATEXT)
SELECT a.AID + cntr
,a.ATEXT
FROM a FETCH FIRST 5 ROWS ONLY
@

--------------------
DECLARE cntr INTEGER DEFAULT 2
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0104N An unexpected token "2" was found following "CNTR INTEGER DEFAULT".
Expected tokens may include: "END-OF-STATEMENT". SQLSTATE=42601

INSERT INTO HAYA_M000.ATEST (AID, ATEXT) SELECT HAYA_M000.ATEST.AID + cntr ,HAYA_M000.ATEST.ATEXT FROM HAYA_M000.ATEST FETCH FIRST 1 ROWS ONLY
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0206N "CNTR" is not valid in the context where it is used. SQLSTATE=42703
...
Рейтинг: 0 / 0
Compound batch вообще возможен или только Stored Procedure ?
    #33055553
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
65.
66.
67.
68.
69.
-------------------------------------------------------------
-- t.sql 
-- запускать:
-- f:\sqllib\bin\db2clpex db2 -c- -z t.log -td@ -v -f t.sql
-- результат выполнения смотрим в t.log
-------------------------------------------------------------
connect to test@

create schema myschema@
commit@
set schema myschema@

echo *===================================@
echo *теперь можем работать в своей схеме@

create table testid (
	id int
)
@
commit@

echo *========================@
echo *смотрим содержание схемы@
list tables for schema myschema@

echo *=========================@
echo *вставляем тестовые данные@

insert into testid values
( 1 ),( 2 ),( 3 ),( 4 ),( 5 )
@
commit@

echo *=====================@
echo *смотрим чего наделали@
select * from testid@

echo *================================@
echo *а теперь маленький compound sql @
begin atomic
	declare cnt int;
	declare max_id int;
	-- узнаем максимальный id, чтоб наши id не пересеклись
	set (cnt,max_id)=( select  count(*),max(id)  from testid );
	-- генерим записи из предыдущих записей
	insert into testid
	select
		id+max_id
	from
		testid
	where
		id<=max_id;
end
@

-- обязательно делаем commit
-- т.к. составной оператор всегда проходит 
-- в рамках одной единицы работы
commit@

echo *=================@
echo *смотрим результат@
select * from testid@

-- чистим все за собой
drop table testid@
commit@
drop schema myschema restrict@
commit@


Код: 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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
connect to test

   Database Connection Information

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


create schema myschema
DB20000I  The SQL command completed successfully.

commit
DB20000I  The SQL command completed successfully.

set schema myschema
DB20000I  The SQL command completed successfully.

*===================================
*теперь можем работать в своей схеме
create table testid ( id int )
DB20000I  The SQL command completed successfully.

commit
DB20000I  The SQL command completed successfully.

*========================
*смотрим содержание схемы
list tables for schema myschema

Table/View                      Schema          Type  Creation time
------------------------------- --------------- ----- --------------------------
TESTID                          MYSCHEMA        T      2005 - 05 - 10 - 11 . 44 . 46 . 515002 

   1  record(s) selected.


*=========================
*вставляем тестовые данные
insert into testid values ( 1 ),( 2 ),( 3 ),( 4 ),( 5 )
DB20000I  The SQL command completed successfully.

commit
DB20000I  The SQL command completed successfully.

*=====================
*смотрим чего наделали
select * from testid

ID         
-----------
           1 
           2 
           3 
           4 
           5 

   5  record(s) selected.


*================================
*а теперь маленький compound sql 
begin atomic
	declare cnt int;
	declare max_id int;
	-- узнаем максимальный id, чтоб наши id не пересеклись
	set (cnt,max_id)=( select  count(*),max(id)  from testid );
	-- генерим записи из предыдущих записей
	insert into testid
	select
		id+max_id
	from
		testid
	where
		id<=max_id;
end

DB20000I  The SQL command completed successfully.

commit
DB20000I  The SQL command completed successfully.

*=================
*смотрим результат
select * from testid

ID         
-----------
           1 
           2 
           3 
           4 
           5 
           6 
           7 
           8 
           9 
          10 

   10  record(s) selected.


drop table testid
DB20000I  The SQL command completed successfully.

commit
DB20000I  The SQL command completed successfully.

drop schema myschema restrict
DB20000I  The SQL command completed successfully.

commit
DB20000I  The SQL command completed successfully.

...
Рейтинг: 0 / 0
Compound batch вообще возможен или только Stored Procedure ?
    #33055591
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
------------>For gardenman :

Огромное спасибо!!! Все получилось

Вот только хотела запустить для 100 000 000 в одном цикле, а он сделал только 10 000 000. Я понимаю. Можно запустить еще 10 раз, но хочется понять, почему ? Даже SQL Server сделал все в одном цикле. Неужели DB2 не способна?
...
Рейтинг: 0 / 0
Compound batch вообще возможен или только Stored Procedure ?
    #33055792
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
между MS SQL и DB2 в обработке SQL выражений есть принципиальная разница. В DB2 все транзакции начинаются неявно с первого INSERT/DELETE/UPDATE оператора. У MS SQL, если не ставить явно begin transaction - каждый оператор - атомарен. Т.е. опрератор работает в одной транзакции. Транзакция началась и закончилась. Когда вы делаете begin atomic....end - вы все ограничиваете одной транзакцией. Commit внутри этого болка не допускается. Поэтому 1) Кол-во блокировок на строки может превысить допустимый предел или пойдет эскалация. Чтобы этого не было можно явно сделать lock table in exlusive mode . 2) лог может переполниться. Поэтому либо сделайте огромный лог (есть вариант с беконечным логом) либо делайте много транзакций вменяемого размера.
3) Пишите процедуру, внутри процедуры вы можете явно говорить commit после, допустим, каждой тысячи записей.
Или, в конце-концов запускаете в параллель несколько процедур генерации из нескольких сессий а id раздавайте через sequence или identity, чтоб не было нахлестов в первичном ключе. (лучше sequence).

Коль у вы генерите 100 млн. записей, то полагаю машина у вас не слабая.
Вариант c "бесконечным" логом вам вполне подойдет.
Запустите несколько сессий генерации, а в какой-нить одной сессии можете наблюдать скоко вставилось рекордов (с помощью грязного чтения):
select count(*) from <you table> with ur
или посмотрев на значение sequence.
...
Рейтинг: 0 / 0
Compound batch вообще возможен или только Stored Procedure ?
    #33056706
Toskana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanмежду MS SQL и DB2 в обработке SQL выражений есть принципиальная разница. В DB2 все транзакции начинаются неявно с первого INSERT/DELETE/UPDATE оператора. У MS SQL, если не ставить явно begin transaction - каждый оператор - атомарен. Т.е. опрератор работает в одной транзакции. Транзакция началась и закончилась. Когда вы делаете begin atomic....end - вы все ограничиваете одной транзакцией. Commit внутри этого болка не допускается. Поэтому 1) Кол-во блокировок на строки может превысить допустимый предел или пойдет эскалация. Чтобы этого не было можно явно сделать lock table in exlusive mode . 2) лог может переполниться. Поэтому либо сделайте огромный лог (есть вариант с беконечным логом) либо делайте много транзакций вменяемого размера.
3) Пишите процедуру, внутри процедуры вы можете явно говорить commit после, допустим, каждой тысячи записей.
Или, в конце-концов запускаете в параллель несколько процедур генерации из нескольких сессий а id раздавайте через sequence или identity, чтоб не было нахлестов в первичном ключе. (лучше sequence).

Коль у вы генерите 100 млн. записей, то полагаю машина у вас не слабая.
Вариант c "бесконечным" логом вам вполне подойдет.
Запустите несколько сессий генерации, а в какой-нить одной сессии можете наблюдать скоко вставилось рекордов (с помощью грязного чтения):
select count(*) from <you table> with ur
или посмотрев на значение sequence.

--------------------------------
Вариант c "бесконечным" логом вам вполне подойдет

Ну вот, все свалилось. LOG переполнен, транзакция откатилась.

Как сначала посмотреть характеристики LOGa- постоянные или динамические (т.е. может ли увеличиваться до бесконечности) ?

Подскажите, как установить LOG, чтобы рос до бесконечности?
...
Рейтинг: 0 / 0
Compound batch вообще возможен или только Stored Procedure ?
    #33059787
nkulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу мониторинга состояния Ви2

Если у тебя 8.2
db2pd -db sample -log
Если меньше
db2 ? get snapshot for ....
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Compound batch вообще возможен или только Stored Procedure ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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