Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Анонимный блок SQL PL / 24 сообщений из 24, страница 1 из 1
25.04.2006, 14:38
    #33688973
Serge Chernushenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Здравствуйте подскажите пожалуйста как через Quest Central работая с базой данных DB2 написать и выполнить анонимный SQL PL блок ? тоесть не создавая хранимой процедуры. Дайте пожалуйста примерчик.
...
Рейтинг: 0 / 0
25.04.2006, 15:13
    #33689090
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Serge ChernushenkoЗдравствуйте подскажите пожалуйста как через Quest Central работая с базой данных DB2 написать и выполнить анонимный SQL PL блок ? тоесть не создавая хранимой процедуры. Дайте пожалуйста примерчик.

Наверное лучшим аналогом будет то, что называется COMPOUND SQL.
Однако имейте в виду что все в этом блоке выполняется в одной транзакции.
Т.е. никаких COMMIT ROLLBACK DECLARE CURSOR и пр.
Типа - не Oracle это.

http://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/r0004240.htm
...
Рейтинг: 0 / 0
25.04.2006, 17:27
    #33689627
Serge Chernushenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Нельзя ли примерчик ?

Хотелось бы что либо с объявлением переменной внутри этого блока, но без создания хранимой процедуры.
...
Рейтинг: 0 / 0
25.04.2006, 17:41
    #33689673
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Так ссылку же вроде правильную дали... Там все есть...
...
Рейтинг: 0 / 0
25.04.2006, 17:41
    #33689674
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- file: t.sql

create table test.cnt (cnt int not null, name varchar( 100 )) @

begin atomic
        declare var int default  0 ;
        set var=(select count(*) from syscat.tables);
        insert into test.cnt (cnt,name) values (var,'SYSCAT.TABLES');
end
@

rollback
@

Запускать на выполнение:
db2 -c- -td@ -vf t.sql

Результат:

E:\DISK-E\work\COMPOUND>db2 -c- -td@ -vf t.sql

create table test.cnt (cnt int not null, name varchar(100))
DB20000I The SQL command completed successfully.

begin atomic
declare var int default 0;
set var=(select count(*) from syscat.tables);
insert into test.cnt (cnt,name) values (var,'SYSCAT.TABLES');
end

DB20000I The SQL command completed successfully.

rollback
DB20000I The SQL command completed successfully.

Я не уверен что это то, что вам надо.
Лучше скажите что у вас за задача такая?
...
Рейтинг: 0 / 0
25.04.2006, 17:55
    #33689721
Serge Chernushenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Задача в следующем.
У меня нет прав на создание хранимых процедур в базе, тем не менее мне необходимо удалить записи из таблицы выбирая их по какому-либо критерию, и параллельно удалять все связанные записи в других таблицах.
В Oracle я просто написал бы PL/SQL анонимный блок, в нем сделал бы один или несколько курсорных циклов, с операторами delete внутри и выполнил бы этот блок.
...
Рейтинг: 0 / 0
25.04.2006, 17:56
    #33689724
Serge Chernushenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Здесь у меня в распоряжении программа Quest Central for DB2
...
Рейтинг: 0 / 0
25.04.2006, 18:25
    #33689804
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Serge ChernushenkoЗадача в следующем.
У меня нет прав на создание хранимых процедур в базе, тем не менее мне необходимо удалить записи из таблицы выбирая их по какому-либо критерию, и параллельно удалять все связанные записи в других таблицах.
В Oracle я просто написал бы PL/SQL анонимный блок, в нем сделал бы один или несколько курсорных циклов, с операторами delete внутри и выполнил бы этот блок.

Понятен ваш подход. Понятна структура базы. Ссылочная целостность отсутствует напрочь.:)
Пред тем как что либо делать, убедитесь что у вас лог достаточно большой (а то транзакция не поместится). Или ограничивайте выборку c помощью fetch first N rows only

Делайте одним запросом так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with
   tblmain as (
   select * from old table (delete from main table where ...<тут критерий>.... fetch first  1000  rows only),
   tblclild1 as (
      select * from old table (delete from child1 where child1.id1 in 
            (select id1 from tblmain)
   ),
   tblclild2 as (
      select * from old table (delete from child2 where child2.id2 in 
            (select id2 from tblmain)
   )
select 
   count(*),
   (select count(*) from tblclild1),
   (select count(*) from tblclild2)
from
   tblmain

Понятно?
...
Рейтинг: 0 / 0
25.04.2006, 18:28
    #33689814
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Да, и еще, а версия DB2 какая?....
...
Рейтинг: 0 / 0
25.04.2006, 18:31
    #33689820
Serge Chernushenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Спасибо большое, буду пробовать делать так.


P.S. Ссылочная целостность есть, но каскадности удаления там не указано, поскольку за каскадность у нас отвечает Hibernate. Та что приходится извращаться. :(
...
Рейтинг: 0 / 0
25.04.2006, 18:41
    #33689849
Serge Chernushenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
DB2 версии 8
...
Рейтинг: 0 / 0
25.04.2006, 22:29
    #33690207
Anton Demidov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
ну вот, опять DB2 AS/400 обделённой осталась - там не поддерживается конструкция begin atomic.
2 gardenman - спасибо за пример с SELECT FROM DELETE - в оракле такого нет - давно хотел разобраться с ним. Впрочем, на AS/400 это опять не поддерживается.
Код: plaintext
1.
2.
--
Антон
Per rectum ad astrum
...
Рейтинг: 0 / 0
26.04.2006, 09:20
    #33690516
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
anton, видимо, у вас до сих пор нет db2 cookbook.
...
Рейтинг: 0 / 0
26.04.2006, 10:55
    #33690838
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Код: 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.
create table maintable (
  id  integer not null primary key,
  id1 integer not null unique,
  id2 integer not null unique
);

create table child1(
  id  integer not null primary key,
  id1  integer not null,
  constraint x1 foreign key(id1) references maintable(id1)
);

create table child2(
  id  integer not null primary key,
  id2  integer not null,
  constraint x2 foreign key(id2) references maintable(id2)
);

insert into maintable values ( 1 , 1 , 1 ), ( 2 , 2 , 2 );
insert into child1 values( 1 , 1 ), ( 2 , 2 );
insert into child2 values( 1 , 1 ), ( 2 , 2 );

with
  tblmain as (
    select * 
    from old table 
      (
        delete from maintable 
        where id =  1 
      )
   ),
   tblclild1 as (
     select * 
     from old table 
       (
         delete from child1 
         where child1.id1 in
            (select id1 from tblmain)
       )
   ),
   tblclild2 as (
     select * 
     from old table 
       (
         delete from child2 
         where child2.id2 in
            (select id2 from tblmain)
       )
   )
select
   count(*),
   (select count(*) from tblclild1),
   (select count(*) from tblclild2)
from
   tblmain 
;
select * from maintable;
select * from child1;
select * from child2;

drop table maintable;
drop table child1;
drop table child2;

Имеем SQL0532N A parent row cannot be deleted because the relationship "VVM.CHILD1.X1" restricts the deletion. SQLSTATE=23504, как я и подозревал.

Думаю, надо писать немного по-другому (сейчас проверю).
...
Рейтинг: 0 / 0
26.04.2006, 10:58
    #33690853
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Я думал что ссылочной целостности нет.
Кстати, кто вам мешает убить FK на время?

Ну или в конце концов нужно идти от конца к началу...
...
Рейтинг: 0 / 0
26.04.2006, 11:21
    #33690963
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Код: 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.
WITH  
  tblclild1(id,id1) as (
    select id,id1 
    from old table 
      (
        delete from child1 c1
        where c1.id1 in
           (select t.id1 from maintable t where t.id= 1 )
      ) 
  ),
  tblclild2(id,id2)as(
    select id,id2 
    from old table 
      (
        delete from child2 c2
        where c2.id2 in
           (select t.id2 from maintable t where t.id= 1 )
      ) 
  ),
  tblmain (id,id1,id2) as (
    select id,id1,id2 
    from old table 
      (
        delete from maintable t
        where t.id =  1 
      )
  )
select
  count(*),
  (select count(*) from tblmain)
from
  (values((select count(*) from tblclild1))) as x1,
  (values((select count(*) from tblclild2))) as x2
;
Вот так "дети" будут убиты раньше "родителей" ;-)
...
Рейтинг: 0 / 0
26.04.2006, 11:24
    #33690980
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
gardenmanЯ думал что ссылочной целостности нет.
Кстати, кто вам мешает убить FK на время?
Как нету, когда есть? Выше же написано. А FK помешает убить тот же, кто мешает создавать хранимые процедуры и переопределить FK на on delete cascade.
...
Рейтинг: 0 / 0
26.04.2006, 11:30
    #33691008
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Victor Metelitsa gardenmanЯ думал что ссылочной целостности нет.
Кстати, кто вам мешает убить FK на время?
Как нету, когда есть? Выше же написано. А FK помешает убить тот же, кто мешает создавать хранимые процедуры и переопределить FK на on delete cascade.
Ну да, ты прав. Вобщем-то всё получится если подумать.
...
Рейтинг: 0 / 0
26.04.2006, 12:01
    #33691125
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Victor - выложи explain, please.
Интересно, как вот оно (оптимайзер) понимает....
...
Рейтинг: 0 / 0
26.04.2006, 12:28
    #33691260
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
ну блин...
...
Рейтинг: 0 / 0
26.04.2006, 12:36
    #33691299
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Ни одноuj индекса нет - сплошные tablescans
...
Рейтинг: 0 / 0
26.04.2006, 13:20
    #33691520
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Таблички маленькие, индексы бы не помогли.

Никто не обратил внимание, что умнее было бы написать просто
Код: plaintext
1.
2.
3.
4.
5.
6.
        delete from child1 c1
        where c1.id1 in           (select t.id1 from maintable t where t.id= 1 );
        delete from child2 c2
        where c2.id2 in           (select t.id2 from maintable t where t.id= 1 );
        delete from maintable t
        where t.id =  1 ;
;
?

;-)
;-)
;-)
...
Рейтинг: 0 / 0
26.04.2006, 13:26
    #33691555
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Тут самая фича в том, чтобы удаление сделать согласованным, чтобы удалять по критерию, но порциями (чтобы избежать переполнения лога).
Если делать разными операторами а какой-то не пройдет - либо транзакцию откатывать либо хранить во временных таблицах удаленные строки.
...
Рейтинг: 0 / 0
26.04.2006, 14:09
    #33691770
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимный блок SQL PL
Victor - так gardenman прав, если уж требование согласованности...
Хотя, в основном, набором последовательных запросов и делается, с поправкой на export перед delete.
Но одним запросом красивше :)
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Анонимный блок SQL PL / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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