Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / проверить нарушение ограничения / 5 сообщений из 5, страница 1 из 1
18.09.2008, 20:24
    #35547546
ondin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверить нарушение ограничения
Такая ситуация нужно исправить строковые значения (удалить пробелы вначале), но проблема в том что при этом нарушается ограничение
ALTER TABLE ENERGY.ADDRESS
ADD CONSTRAINT U_ADDRSS0
UNIQUE (STREETCODE,LOCATIONHOUSE,LOCATIONAPP);

(LOCATIONHOUSE и LOCATIONAPP) - это те столбцы которые нужно исправить. Другими словами есть записи которые различаются только кол-вом пробелов в одной или двух ячейках. Мне нужно все пробелы удалить, все ссылки на одинаковые записи свести к одной, все кроме этой одной записи удалить. Для того как я это представляю мне нужна возможность отловить нарушение этого ограничения.
CREATE PROCEDURE p1()
BEGIN
FOR cycle AS
update ADDRESS
set LOCATIONHOUSE = ltrim(LOCATIONHOUSE),
LOCATIONAPP = ltrim(LOCATIONAPP)
DO
//здесь проверяем нарушилось ли ограничение (как это сделать?)
//дальше делаем то что нужно
END FOR;

END;

возможно ли так сделать?
...
Рейтинг: 0 / 0
19.09.2008, 01:01
    #35547787
Kru
Kru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверить нарушение ограничения
Если я Вас правильно понял - Вы хотите сохранить уникальность комбинации полей STREETCODE,LOCATIONHOUSE,LOCATIONAPP после удаления пробелов из LOCATIONHOUSE,LOCATIONAPP. Для этого, если на эти поля будут ссылаться несколько записей, вы собираетесь оставить только одну и остальные удалить.
Так ли это?

Если да, то может быть Вам такой вариант подойдёт:

Код: 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.
create table tempdb.test( STREETCODE smallint ,LOCATIONHOUSE varchar( 50 ),LOCATIONAPP varchar( 50 ), ltr char( 1 ))

;
insert into tempdb.test values( 1 , 'house1', 'location1', 'A')
, ( 1 , 'house 1', 'location 1', 'B')
, ( 2 , 'house   1', 'location   1', 'C')
, ( 2 , 'house     1', 'location     1', 'D')
, ( 3 , 'house       1', 'location      1', 'E')

;

create procedure tempdb.test_p
begin
declare SQLSTATE char( 5 ) default '00000';
declare v_STREETCODE smallint;
declare v_LOCATIONHOUSE varchar( 50 );
declare v_LOCATIONAPP varchar( 50 );
declare v_ltr char( 1 );
declare cur1 cursor with return to client for
with del(STREETCODE, LOCATIONHOUSE, LOCATIONAPP, ltr )
as (select STREETCODE, LOCATIONHOUSE, LOCATIONAPP, ltr from old table 
    ( delete from tempdb.test  ) ) 
select STREETCODE, replace(LOCATIONHOUSE, ' ',''), replace(LOCATIONAPP, ' ',''), min(ltr) as ltr 
from del 
group by  STREETCODE, replace(LOCATIONHOUSE, ' ',''), replace(LOCATIONAPP, ' ','');

open cur1;
   fetch from cur1 into  v_STREETCODE, v_LOCATIONHOUSE, v_LOCATIONAPP, v_ltr;

     while (SQLSTATE = '00000') do
        insert into tempdb.test
        values (v_STREETCODE, v_LOCATIONHOUSE, v_LOCATIONAPP, v_ltr);
       
        fetch from cur1 into  v_STREETCODE, v_LOCATIONHOUSE, v_LOCATIONAPP, v_ltr; 
     end while;

close cur1;
end

Выполните
Код: plaintext
1.
2.
select * from tempdb.test 
потом  call tempdb.test_p()
и потом select * from tempdb.test 

Это то, что Вам нужно?

С уважением,
Андрей
...
Рейтинг: 0 / 0
19.09.2008, 10:14
    #35548151
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверить нарушение ограничения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with a(del_count) as (
 select count( 1 )
 from old table(
 delete from (
 select rownumber() over (partition by streetcode, ltrim(LOCATIONHOUSE), ltrim(LOCATIONAPP)) rn
 from address) b where rn> 1 ) c
)
, b(upd_count) as (
 select count( 1 )
 from old table(
 update address
 set LOCATIONHOUSE=ltrim(LOCATIONHOUSE), LOCATIONAPP=ltrim(LOCATIONAPP) 
 where LOCATIONHOUSE like ' %' or LOCATIONAPP like ' %'
 ) c
)
select 'deleted: '||char(del_count) from a
  union all
select 'updated: '||char(upd_count) from b;
Только не запускайте этот запрос из db2 v9.x command center - он, похоже из-за какого-то бага, хоть и возвращает правильный результат, но реально изменения в таблице не делает.
Сохраните этот запрос в файл и выполните в командной строке (для win это db2cmd):
Код: plaintext
1.
db2 connect to your_database user ... using ...
db2 -tf some_file.sql
...
Рейтинг: 0 / 0
19.09.2008, 21:10
    #35549909
Kru
Kru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверить нарушение ограничения
Марк, добрый день.
Ваш вариант отлично отработал из коммандной строки под Линуксами.

Кстати в Db Artisan - отказался работать. У меня как-раз 9я версия. Точно какой-то баг в работе с графическим интерфейсом есть.
...
Рейтинг: 0 / 0
19.09.2008, 22:33
    #35549989
ondin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверить нарушение ограничения
спасибо за ответы. найду нормальную документацию по синтаксису, разберусь с этим.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / проверить нарушение ограничения / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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