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

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

С 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
Простой запрос без процедуры if/then/else
    #39023572
FYI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FYI
Гость
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
Простой запрос без процедуры if/then/else
    #39023576
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Простой запрос без процедуры if/then/else
    #39023754
slitvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, не работает
...
Рейтинг: 0 / 0
Простой запрос без процедуры if/then/else
    #39023770
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slitvin,

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

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

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

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


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

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

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

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

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

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

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

BEGIN ATOMIC
...
END@

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

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
Простой запрос без процедуры if/then/else
    #39023988
FYI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FYI
Гость
slitvin,

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


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