Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Простой запрос без процедуры if/then/else / 13 сообщений из 13, страница 1 из 1
05.08.2015, 13:19
    #39023471
slitvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
Приветствую!

Возникла необходимость в написании простого запроса для проверки наличия поля в таблице и создания при необходимости.
Но вот никак не могу сообразить, перепробовал множество вариантов. Знаю, что с процедурами все работает, но мне нужно вне процедуры. Суть задачи: есть программа-генератор скриптов по обновлению БД. БД внешняя, в ней нельзя создавать свои процедурки.

С db2 работаю аж 3 дня, простите если вопрос тривиальный.
Вот запросы, которые я пробовал.

BEGIN ATOMIC
IF (NOT EXISTS(
SELECT 1 FROM SYSCAT.COLUMNS WHERE TABNAME ='TEST_TABLE' AND COLNAME = 'TEST2'))
THEN
EXECUTE IMMEDIATE 'alter table ... add ...'!
END IF!
END
GO
--#SET DELIMITER ;


====================

BEGIN ATOMIC
IF (NOT EXISTS(
SELECT 1 FROM SYSCAT.COLUMNS WHERE TABNAME ='TEST_TABLE' AND COLNAME = 'TEST2'))
THEN
alter table ... add ... ;
END IF;
END
GO
========================================
IF
(
NOT EXISTS
(
SELECT 1
FROM SYSCAT.COLUMNS
WHERE
TABSCHEMA = 'TMRO'
AND TABNAME ='test_table'
AND COLNAME = 'test_column'
)
)
THEN
alter table ... add ... ;
END IF;
...
Рейтинг: 0 / 0
05.08.2015, 14:57
    #39023572
FYI
FYI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
slitvin,

If the ATOMIC keyword is specified in a dynamically prepared compound statement or an SQL function that is not within a module, the
compound statement is processed as a compound SQL (inlined) statement.

&

EXECUTE IMMEDIATE statement
...
Invocation
This statement can only be embedded in an application program. It is an executable statement that cannot be dynamically prepared
...
Рейтинг: 0 / 0
05.08.2015, 15:00
    #39023576
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
slitvin,

Добрый день.

myscript.sql
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
--#SET TERMINATOR @
BEGIN 
  --EXECUTE IMMEDIATE 'create table TEST_TABLE (TEST1 INT) IN USERSPACE1';
IF (NOT EXISTS(
  SELECT 1 FROM SYSCAT.COLUMNS 
  WHERE TABSCHEMA=USER AND TABNAME ='TEST_TABLE' AND COLNAME = 'TEST2'
))
THEN
  EXECUTE IMMEDIATE 'alter table TEST_TABLE add TEST2 INT';
END IF;
END
@


db2 connect to mydb ...
db2 -vf myscript.sql -z myscript.log
...
Рейтинг: 0 / 0
05.08.2015, 17:15
    #39023754
slitvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
К сожалению, не работает
...
Рейтинг: 0 / 0
05.08.2015, 17:24
    #39023770
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
slitvin,

А вот я бы _крайне_ не рекоменовал создавать инструменты для "условного" накатывания скриптов.

Если разработчики, формирующие поставку, не знают доподлинно, есть такое поле в БД или нет, значит у них нет контроля за состоянием структуры БД, и они вообще не знают, "на что" накатывают скрипты.

Состояние БД после такого наката будет полностью неопределено, а, например, тестирование на ней не будет иметь никакой ценности.

Инструменты для условного наката будут только маскировать ошибки. Лучше пусть скрипт свалится, чем молча накатится неправильная поставка.


PS Правды ради, успешность наката сама по себе тоже не гарантирует, что была соблюдена правильная очерёдность и полнота поставок, но зачем же усугублять возможные проблемы.

Условные накаты DDL - это костыль (вредный, но неизбежный) для СУБД, у которых DDL выполняется вне общего транзакционного механизма (и не откатывается по ошибке rollback'ом).
...
Рейтинг: 0 / 0
05.08.2015, 17:35
    #39023784
slitvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
Доля правды в Ваших словах есть, однако решение выбираю не я.
Это необходимо для нескольких СУБД, но вот с db2 уже третий день бьюсь ))
...
Рейтинг: 0 / 0
05.08.2015, 17:44
    #39023792
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
slitvin,

Вероятней всего ошибка в том, как процессит команду сам RazorSQL.
Выполните скрипт Command Line Processor'ом командами, указанными Марком.
...
Рейтинг: 0 / 0
05.08.2015, 18:19
    #39023815
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
slitvin,

постарайтесь в этом RazorSQL в настройках найти, как изменить statement termination character (как-то так должно быть) с ; по-умолчанию на @.
...
Рейтинг: 0 / 0
05.08.2015, 18:27
    #39023819
slitvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
Mark Barinstein,

Думаю, проблема не в termination character. Поскольку я добился выполнения скрипта ниже без его изменения

BEGIN ATOMIC
DECLARE STMT VARCHAR(200);
IF
(
NOT EXISTS
(
SELECT 1 FROM SYSCAT.COLUMNS
WHERE TABSCHEMA='DB2ADMIN' AND TABNAME ='TABLE1' AND COLNAME = 'clm1'
)
)
THEN
--alter table TABLE1 add column clm1 varchar(20);-
select * from SYSCAT.COLUMNS ;
select * from SYSCAT.COLUMNS ;
END IF;

END
...
Рейтинг: 0 / 0
05.08.2015, 18:27
    #39023820
slitvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
Но вот этот брыкается на PREP S1 FROM STMT;

BEGIN ATOMIC
DECLARE STMT VARCHAR(200);
IF
(
NOT EXISTS
(
SELECT 1 FROM SYSCAT.COLUMNS
WHERE TABSCHEMA='DB2ADMIN' AND TABNAME ='TABLE1' AND COLNAME = 'clm1'
)
)
THEN
--alter table TABLE1 add column clm1 varchar(20);-
--select * from SYSCAT.COLUMNS ;
--select * from SYSCAT.COLUMNS ;
SET STMT = 'select * from SYSCAT.COLUMNS';
PREP S1 FROM STMT;
-- EXECUTE S1;
END IF;

END
...
Рейтинг: 0 / 0
05.08.2015, 18:44
    #39023828
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
slitvin,

В ATOMIC блоке нельзя делать PREPARE или EXECUTE.

Если этот RazorSQL не умеет выполнять
BEGIN
...
END@

а может только

BEGIN ATOMIC
...
END@

то это именно его проблемы, а не db2.
...
Рейтинг: 0 / 0
05.08.2015, 19:18
    #39023838
slitvin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
После долгих часов борьбы решение найдено. Слава Богу!

BEGIN NOT ATOMIC
IF
(
NOT EXISTS
(
SELECT 1 FROM SYSCAT.COLUMNS
WHERE TABSCHEMA='DB2ADMIN' AND TABNAME ='TABLE1' AND COLNAME = 'CLM1'
)
)
THEN
EXECUTE IMMEDIATE 'alter table table1 add column clm1 int';
END IF;

END
...
Рейтинг: 0 / 0
06.08.2015, 08:39
    #39023988
FYI
FYI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой запрос без процедуры if/then/else
slitvin,

)))
Это то , что Марк и предлагал.
BEGIN NOT ATOMIC ... END = BEGIN ... END
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Простой запрос без процедуры if/then/else / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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