powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Анонимный блок SQL PL
24 сообщений из 24, страница 1 из 1
Анонимный блок SQL PL
    #33688973
Serge Chernushenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте подскажите пожалуйста как через Quest Central работая с базой данных DB2 написать и выполнить анонимный SQL PL блок ? тоесть не создавая хранимой процедуры. Дайте пожалуйста примерчик.
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33689090
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Анонимный блок SQL PL
    #33689627
Serge Chernushenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нельзя ли примерчик ?

Хотелось бы что либо с объявлением переменной внутри этого блока, но без создания хранимой процедуры.
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33689673
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ссылку же вроде правильную дали... Там все есть...
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33689674
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Анонимный блок SQL PL
    #33689721
Serge Chernushenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача в следующем.
У меня нет прав на создание хранимых процедур в базе, тем не менее мне необходимо удалить записи из таблицы выбирая их по какому-либо критерию, и параллельно удалять все связанные записи в других таблицах.
В Oracle я просто написал бы PL/SQL анонимный блок, в нем сделал бы один или несколько курсорных циклов, с операторами delete внутри и выполнил бы этот блок.
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33689724
Serge Chernushenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь у меня в распоряжении программа Quest Central for DB2
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33689804
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Анонимный блок SQL PL
    #33689814
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и еще, а версия DB2 какая?....
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33689820
Serge Chernushenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое, буду пробовать делать так.


P.S. Ссылочная целостность есть, но каскадности удаления там не указано, поскольку за каскадность у нас отвечает Hibernate. Та что приходится извращаться. :(
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33689849
Serge Chernushenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DB2 версии 8
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33690207
Фотография Anton Demidov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот, опять DB2 AS/400 обделённой осталась - там не поддерживается конструкция begin atomic.
2 gardenman - спасибо за пример с SELECT FROM DELETE - в оракле такого нет - давно хотел разобраться с ним. Впрочем, на AS/400 это опять не поддерживается.
Код: plaintext
1.
2.
--
Антон
Per rectum ad astrum
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33690516
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
anton, видимо, у вас до сих пор нет db2 cookbook.
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33690838
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Анонимный блок SQL PL
    #33690853
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думал что ссылочной целостности нет.
Кстати, кто вам мешает убить FK на время?

Ну или в конце концов нужно идти от конца к началу...
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33690963
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Анонимный блок SQL PL
    #33690980
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanЯ думал что ссылочной целостности нет.
Кстати, кто вам мешает убить FK на время?
Как нету, когда есть? Выше же написано. А FK помешает убить тот же, кто мешает создавать хранимые процедуры и переопределить FK на on delete cascade.
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33691008
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Metelitsa gardenmanЯ думал что ссылочной целостности нет.
Кстати, кто вам мешает убить FK на время?
Как нету, когда есть? Выше же написано. А FK помешает убить тот же, кто мешает создавать хранимые процедуры и переопределить FK на on delete cascade.
Ну да, ты прав. Вобщем-то всё получится если подумать.
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33691125
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
Victor - выложи explain, please.
Интересно, как вот оно (оптимайзер) понимает....
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33691260
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
ну блин...
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33691299
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни одноuj индекса нет - сплошные tablescans
...
Рейтинг: 0 / 0
Анонимный блок SQL PL
    #33691520
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблички маленькие, индексы бы не помогли.

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


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