Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Текущее значение индекса автоинкремента уникального столбца / 18 сообщений из 18, страница 1 из 1
04.03.2015, 09:12
    #38894242
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
У меня есть таблица (например, Table1) в бд и у нее есть столбец (например, ID), который является первичным ключом и определяется автоинкрементом с шагом 1.
Как мне определить текущее значение счетчика автоинкремента?
И как мне его поменять на некоторое значение, например, 18?
...
Рейтинг: 0 / 0
04.03.2015, 09:56
    #38894277
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
ASukhov1986,

Чтобы узнать текущее значение, гадо его "потребить", т.е. вставить запись, после чего сделать rollback.
Правда, увеличение значения счетчика не откатится.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table test_inc(
  id int not null generated always as identity
, v int
) in userspace1;

-- with autocommit set to OFF
select id
from new table(
insert into test_inc (id, v) values (default, 0)
);

rollback;

-- resetting
alter table test_inc alter id restart with 18;
...
Рейтинг: 0 / 0
04.03.2015, 10:46
    #38894344
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Mark Barinstein,
спасибо тогда у меня следующий вопрос:
Я выполнил миграцию БД на DB2 с 9 на 10.55 с помощью утилиты db2move (export, создал с помощью команды create database БД, import, написал скрипт добавления функций процедур, триггеров и т.д.).
Затем в моей системе начал добавлять (обновлять) в таблицу новую запись INSERT INTO WORK_PLACE_ACTUAL (LOCAL_CODE_ID,WORK_PLACE_NAME,SESS_ID) VALUES(6,'788',19) возникла следующая ошибка:
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0723N An error occurred in a triggered SQL statement in trigger
"METR.WORK_PLACE_INS". Information returned for the error includes SQLCODE
"-803", SQLSTATE "23505" and message tokens "1|METR.WORK_PLACE".
SQLSTATE=09000.
Как ее исправить?
...
Рейтинг: 0 / 0
04.03.2015, 10:47
    #38894346
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Mark Barinstein, триггер тут непричем, т.к. на DB2 9 все работает правильно!
...
Рейтинг: 0 / 0
04.03.2015, 10:59
    #38894359
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
ASukhov1986,

Какое-то действие, которое вы делаете с таблицей METR.WORK_PLACE в триггере на WORK_PLACE_ACTUAL, приводит к появлению дублей в уникальном индексе:
Код: sql
1.
2.
3.
4.
5.
SELECT INDNAME, INDSCHEMA
  FROM SYSCAT.INDEXES
  WHERE IID = 1
  AND TABSCHEMA = 'METR'
  AND TABNAME = 'WORK_PLACE'

Вам надо разобраться, почему это происходит.
...
Рейтинг: 0 / 0
04.03.2015, 12:10
    #38894431
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Mark Barinstein,

я еще заметил, что e DB2 9 в системной таблице SYSIBM.SYSTABLES есть моя таблица WORK_PLACE креэйтор METR, в в DB2 10.55 нет. может это как то влиять или нет на возникновение этой ошибки?
...
Рейтинг: 0 / 0
04.03.2015, 12:16
    #38894443
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Mark Barinstein, последнее сообщение неверно, проверил запросом select * from SYSIBM.SYSTABLES where CREATOR='METR'
...
Рейтинг: 0 / 0
04.03.2015, 12:34
    #38894464
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Mark Barinstein, я разобрался нужно выполнить следующий скрипт alter table WORK_PLACE alter WORK_PALCE_ID restart with 100
где 100 - это максимальное значение WORK_PALCE_ID плюс 1 .
...
Рейтинг: 0 / 0
04.03.2015, 12:38
    #38894472
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
ASukhov1986,

db2look на db2 9 должна была сгенерировать в числе прочего и команды рестарта sequence/identity.
Вы ей пользовались для переноса DDL?
...
Рейтинг: 0 / 0
04.03.2015, 14:42
    #38894657
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Mark Barinstein,
нет
...
Рейтинг: 0 / 0
04.03.2015, 14:44
    #38894660
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Mark Barinstein, export->create database->import->create all other objects
...
Рейтинг: 0 / 0
04.03.2015, 15:59
    #38894768
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Как в DB2 в команде
alter table WORK_PLACE alter WORK_PALCE_ID restart with 100
вместо значение 100 реализовать select value(max(METR.WORK_PALCE_ID),0)+1 from METR.WORK_PLACE
...
Рейтинг: 0 / 0
04.03.2015, 18:00
    #38894946
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
ASukhov1986,

Никак.
Такие запросы можно генерировать в несколько приемов.
Вам надо последовательно:

- Выполнить запрос (1):
Код: sql
1.
2.
3.
select 'select ''alter table "'||tabschema||'"."'||tabname||'" alter "'||colname||'" restart with ''||char(value(max("'||colname||'"), 0)+1) from "'||tabschema||'"."'||tabname||'"'
from syscat.colidentattributes
where tabschema='METR' and tabname='WORK_PLACE'


- он вернет текст запроса (2), который надо выполнить
- результатом будет та команда (ALTER), которая вам нужна

Таким образом, убрав WHERE в запросе (1), можно хоть для всех IDENTITY в базе сразу сгенерировать команды рестарта.
Только на каждом этапе будут возвращаться не отдельные команды, а несколько - по числу IDENTITY полей.
...
Рейтинг: 0 / 0
05.03.2015, 17:23
    #38896360
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Mark Barinstein,а как выполнить полученную команду, в MS SQL SERVER есть процедура sp_executesql, а как в DB2?
...
Рейтинг: 0 / 0
06.03.2015, 09:50
    #38896858
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
Mark Barinstein,
вот моя процедура, которая реализует обновление RESTART для всех таблиц БД

Код: plsql
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.
CREATE OR REPLACE PROCEDURE UPDATE_RESTART_VALUE() 
AS:
BEGIN
	DECLARE t_cur_end INTEGER DEFAULT 0;--Лог. переменная признака завершения курсора
	DECLARE tabname_cur varchar(1000);--Название таблицы
	declare sql_text_command varchar(1000);--Текст команды select 'alter...'
	
	DECLARE t CURSOR FOR
	select tabname from syscat.colidentattributes
    where tabschema='METR';
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET t_cur_end=1;
             
    OPEN t;
    
    FETCH t INTO tabname_cur;

    WHILE (t_cur_end=0) DO
         set sql_text_command=(select 'select ''alter table "'||tabschema||'"."'||tabname||'" alter "'||colname||'" restart with ''||char(value(max("'||colname||'"), 0)+1) from "'||tabschema||'"."'||tabname||'"'
                               from syscat.colidentattributes
                               where tabschema='METR' and tabname=tabname_cur);
                               
         EXECUTE IMMEDIATE sql_text_command;
   
         FETCH t INTO tabname_cur;
   END WHILE;

   CLOSE t;
END



при выполнении команды
Код: plsql
1.
EXECUTE IMMEDIATE sql_text_command;

возникает следующая ошибка: An EXECUTE IMMEDIATE statement contains a SELECT or VALUES statement.. SQLCODE=-84, SQLSTATE=42612, DRIVER=4.18.60.
Как ее устранить? Я так понял что в команде EXECUTE IMMEDIATE не должно быть команды SELECT, тогда существует другая команда кроме EXECUTE IMMEDIATE?
...
Рейтинг: 0 / 0
06.03.2015, 10:34
    #38896905
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
ASukhov1986,вопрос решен
...
Рейтинг: 0 / 0
06.03.2015, 10:36
    #38896911
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
ASukhov1986, через PREPARE S1 FROM DSQL;
EXECUTE S1;
...
Рейтинг: 0 / 0
06.03.2015, 11:58
    #38897006
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущее значение индекса автоинкремента уникального столбца
ASukhov1986,

Как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
--#SET TERMINATOR @
set serveroutput on@

begin
  declare stmt varchar(4000);

  for c1 as 
  select 'select ''alter table "'||tabschema||'"."'||tabname||'" alter "'||colname||'" restart with ''||char(value(max("'||colname||'"), 0)+1) from "'||tabschema||'"."'||tabname||'"' stmt
  from syscat.colidentattributes
  where tabschema='METR'
  do
    set stmt = 'set ? = ('||c1.stmt||')';
    prepare s1 from stmt;
    execute s1 into stmt;
    --execute immediate stmt;
    call dbms_output.put_line(stmt);
  end for;
end@


Може выполнить как есть, чтоб посмотреть, какая команда для каждой таблицы будет выполняться.
Если хотите оформить в виде процедуры то заверните begin ... end в процедуру, раскомментируйте execute immediate, уберите call.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Текущее значение индекса автоинкремента уникального столбца / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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