powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 - как создать таблицу с полем varchar(4000)?
19 сообщений из 19, страница 1 из 1
DB2 - как создать таблицу с полем varchar(4000)?
    #34017392
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Вот пытаюсь сделать create table, а оно мне в ответ говорит, что не найдено табличное пространство по умолчанию с размером страницы хотя бы 8192 байт. Что где нужно подкрутить, подскажите пожалуйста? Таблицы по умолчанию создаются в пространстве USERSPACE1, пробовала в квесте сделать ему alter... слегка не получилось. На вкладке Advanced меняю Page size с 4К на 8, в ответ 2 мессаджбокса: "Выбранный размер страницы несовместим с существующим буферпулом. Если вы хотите продолжить, вы должны выбрать совместимый буферпул. Продолжить?" - yes - "Не найдено буферпулов с соответствующим размером страницы", в комбобоксе Bufferpool только IBMDEFAULTBP. Что делать?
Спасибо.
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34017402
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точный текст первой ошибки:
SQL0286N Не найдено табличное пространство по умолчанию с размером страницы по крайней мере 8192, которое мог бы использовать ID авторизации "USER". SQLSTATE=42727
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34017545
kmike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну написано же-не найдено подходящих буферпулов. Так создайте уже BP со страницей 8к и будет вам счастье-можно будет создать табличное пространство со страницей 8к.
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34017976
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DB2 расчитывает максимальный размер записи исходя из предположения, что пользователь может забить все данные "под завязку".
Далее учитывается, что на странице в 4К нужно захватить еще несколько байт под системные нужды.
Вот и получилось, что максимальный объем данных вышел за максимально допустимый размер.
Вам предлагается создать таблицу с размером буфера в 8К.
По умолчанию, DB2 содает USERSPASE1 с размером страниц в 4К.
Вы должны сами создать
а) буферный пул для обслуживания таблиц с размером страницы в 8К
б) создать таблицу, указав подходящий буферный пул.
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34018379
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и не забудте про системное временное табличное простанство размером 8K

Но я рекомендовал бы сразу 32K. Если средняя длина поля varchar будет больше 1000 байт
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34018546
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай, 32К - для буферпула или временного табличного пространства, или для того и другого?
Поле varchar(4000) одно, вообще в таблице 30 полей, из них varchar(256) - 4, varchar(9...23) - 5, varchar(50) - 2, остальное - int, bigint, timestamp и smallint. Какой минимальный размер страницы нужен для буферпула и временного табличного пространства? Чтобы и работало нормально, и места не сильно много занимало?
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34018670
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На основании определения сложно сказать. Нужно смотреть среднюю длину по данным.
Соответсвенно почему лучше больший размер стоки: у тебя при некоторых раскладах может получится порядка 3-4 строк на странице, маловато. это будет влиять на производительность IO.
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34019724
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще то, если пошла такая пьянка, в 4000 символов, то лучше смотреть в сторону типа данных LONG VARCHAR.
Данные этого типа живут отдельно от основных данных строки. Чем-то это смахивает на хранение VARCHAR-ов в Oracle.
Если такой тип данных подходит, тогда можно избежать создания дополнительных пулов.
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34019967
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько сильно отличается работа с типом LONG VARCHAR от простого VARCHAR-а? Интересует синтаксис запросов и особенности работы через OleDBProvider. Если это как в MS SQL (работа с varchar и text - небо и земля), то не подходит, слишком много переписывать.
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34019983
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вопрос. Создаю буферпул, какие partition groups (из набора IBMCATGROUP, IBMDEFAULTGROUP, IBMTEMPGROUP) к нему привязывать? Интуиция подсказывает, что достаточно IBMDEFAULTGROUP и все. Это правильно?
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34020004
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И это еще не все :)
Какой размер буферпула в страницах (Number of pages в GUI квеста) лучше сделать для таких данных?
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34020433
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pimaНасколько сильно отличается работа с типом LONG VARCHAR от простого VARCHAR-а? Интересует синтаксис запросов и особенности работы через OleDBProvider. Если это как в MS SQL (работа с varchar и text - небо и земля), то не подходит, слишком много переписывать.

Не зная, как в OleDBProvider, в Java работа с LONG VARCHAR такая же как и с обычными VARCHAR. Смоти тут .
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34020576
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аааааа, да что ж это за наказание такое!!! Таблица создалась, теперь триггер не создается!
На таблице CENTER_DEVICE_TYPE живет вьюха:
select * from center_device_type where delete_date is null,
на этой вьюхе живет инстидный триггер:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TRIGGER C_D_T_INS
INSTEAD OF INSERT
ON CENTER_DEVICE_TYPE_ACTUAL
REFERENCING NEW AS INSERTED_RECORD FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC 
DECLARE CHANGE_ID INTEGER;

CALL SetChangeBySessionId(INSERTED_RECORD.SESS_ID, CHANGE_ID);

INSERT INTO CENTER_DEVICE_TYPE (RECSTATE, SESS_ID, ENTITY_ID, CREATE_DATE, DELETE_DATE, CREATION_ID, DELETION_ID,
 DEV_CODE, DEVICE_NAME, DEVICE_MARK, TYPE_STR, NORMA_CODE, CODIFF, ORIGINAL_CODIFF, TIME_NORMA, TARIFF, PERIOD, ORIGINAL_PERIOD, GOS_NO, METHOD, MEASURE_TYPE_CODE_ID, MARK_TYPE_ID, DEPRECATED,
 GRADE_OF_ACCURACY, MEASUREMENT_RANGE, CERTIFICATION_NUMBER, CERTIFICATION_FINISH_DATE, MANUFACTURER, METROLOGICAL_BEHAVIOURS )
 VALUES(  1 , NULL, NULL, CURRENT TIMESTAMP, NULL, CHANGE_ID, NULL,
     INSERTED_RECORD.DEV_CODE, INSERTED_RECORD.DEVICE_NAME, INSERTED_RECORD.DEVICE_MARK, INSERTED_RECORD.TYPE_STR, INSERTED_RECORD.NORMA_CODE, INSERTED_RECORD.CODIFF, INSERTED_RECORD.ORIGINAL_CODIFF, INSERTED_RECORD.TIME_NORMA, INSERTED_RECORD.TARIFF, INSERTED_RECORD.PERIOD, INSERTED_RECORD.ORIGINAL_PERIOD, INSERTED_RECORD.GOS_NO, INSERTED_RECORD.METHOD, INSERTED_RECORD.MEASURE_TYPE_CODE_ID, INSERTED_RECORD.MARK_TYPE_ID, INSERTED_RECORD.DEPRECATED,
	 INSERTED_RECORD.GRADE_OF_ACCURACY, INSERTED_RECORD.MEASUREMENT_RANGE, INSERTED_RECORD.CERTIFICATION_NUMBER, INSERTED_RECORD.CERTIFICATION_FINISH_DATE, INSERTED_RECORD.MANUFACTURER, INSERTED_RECORD.METROLOGICAL_BEHAVIOURS);

UPDATE CENTER_DEVICE_TYPE 
 SET ENTITY_ID = CENTER_ID 
 WHERE CENTER_ID = IDENTITY_VAL_LOCAL();
END;

который отказывается создаваться, типа потому что
"SQL1424N Слишком много ссылок на временные переменные и столбцы временных таблиц или в этих ссылках слишком большая длина строки."
Пробую изменить длину поля METROLOGICAL_BEHAVIOURS (то самое злополучное 4000): 1000 - пашем, 2000 - тоже живем, 3000 - умираем. Спасите, плииииз!
Да, в новом буферпуле и табличных пространствах решила ограничиться страницами 8К, потому что средняя длина поля - 263 символа. Больше 1000 знаков - всего 0,5%, а больше 3000 - вообще единицы.
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34020931
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте поставить тригер не на VIEW CENTER_DEVICE_TYPE_ACTUAL, а на таблицу CENTER_DEVICE_TYPE.
У тригеров, помимо событий (INSERT, UPDATE, DELETE) есть условия срабатывания тригера. В эти условия вставте ваше - delete_date is null.
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34021934
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за помощь, но куда ни кинь, всюду клин. Похоже, бум-таки обрезать поле. Траблы следующие:
1) На вьюху можно создать только INSTEAD-триггер
2) На таблицу - только AFTER или BEFORE, INSTEAD-триггер создать нельзя
3) Функция IDENTITY_VAL_LOCAL(), насколько я понимаю, имеет силу только в инстидном триггере после оператора INSERT, в AFTER-триггере от нее остается пшик, идентити можно получить только путем select max(CENTER_ID) from center_device_type. Система многопользовательская, а гарантируется ли, что select max в after-триггере выдаст мне max именно того набора данных, который был на начало сессии (на момент инсерта)? Держит ли after-триггер блокировку, которую создал инициировавший его инсерт, или создает новую? Если новую, то между инсертом и триггером запросто вклинивается еще что-нибудь, и получаем некорректный max.
Т. е. пока я вижу, что нужен только INSTEAD-триггер, с AFTER большие вопросы. INSTEAD - только на вьюху, а на вьюхе он дохнет при большой длине поля.

gals, спасибо, почитала доку, но там:
WHEN condition may not be specified for INSTEAD OF triggers.
В принципе, без разницы, можно вместо WHEN написать:
IF INSERTED_RECORD.DELETE_DATE IS NULL
BEGIN
... тело триггера...
END
, но все равно нужен INSTEAD, а как его создать, я не понимаю.
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34022128
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pima
3) Функция IDENTITY_VAL_LOCAL(), насколько я понимаю, имеет силу только в инстидном триггере после оператора INSERT, в AFTER-триггере от нее остается пшик, идентити можно получить только путем select max(CENTER_ID) from center_device_type.

Разве вам не удасться сделать в AFTER-тригере вместо:
Код: plaintext
1.
2.
UPDATE CENTER_DEVICE_TYPE 
 SET ENTITY_ID = CENTER_ID 
 WHERE CENTER_ID = IDENTITY_VAL_LOCAL()
выполнить такой запрос:
Код: plaintext
1.
2.
UPDATE CENTER_DEVICE_TYPE 
 SET ENTITY_ID = CENTER_ID 
 WHERE CENTER_ID = INSERTED_RECORD.CENTER_ID
?
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34022148
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.
Напишите ddl таблицы

2.
Делать это в instead of триггере - требование системы?
Или можно в after триггере на таблице?
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34023506
Фотография Anton Demidov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант - используйте SEQUENCE объект вместо IDENTITY_VAL_LOCAL()
Код: plaintext
1.
2.
--
Антон
Per rectum ad astrum
...
Рейтинг: 0 / 0
DB2 - как создать таблицу с полем varchar(4000)?
    #34026736
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gals
Код: plaintext
1.
2.
UPDATE CENTER_DEVICE_TYPE 
 SET ENTITY_ID = CENTER_ID 
 WHERE CENTER_ID = INSERTED_RECORD.CENTER_ID
?
Да, туплю, спасибо. Но все равно, скорее всего, 4000 символов пойдут лесом, т. к. в согласованной постановке значилось всего 1000, а заказчик предоставил файл с 4000, вот и думали сделать им типа дополнительный подарок, раз уж такая пьянка. Но после исследования вытекающих переделок нас заломало делать такие подарки, которые надо, если по-хорошему, тестировать. Там еще репликацию ворошить - переводить ее с вьюхи на триггер. В общем, поскольку это не обязательно, решили обрезать до 2000 и не мучиться.
Всем спасибо.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 - как создать таблицу с полем varchar(4000)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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