Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
05.08.2015, 13:19
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
Приветствую! Возникла необходимость в написании простого запроса для проверки наличия поля в таблице и создания при необходимости. Но вот никак не могу сообразить, перепробовал множество вариантов. Знаю, что с процедурами все работает, но мне нужно вне процедуры. Суть задачи: есть программа-генератор скриптов по обновлению БД. БД внешняя, в ней нельзя создавать свои процедурки. С 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 14:57
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 15:00
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
slitvin, Добрый день. myscript.sql Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. db2 connect to mydb ... db2 -vf myscript.sql -z myscript.log ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 17:15
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
К сожалению, не работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 17:24
|
|||
|---|---|---|---|
Простой запрос без процедуры if/then/else |
|||
|
#18+
slitvin, А вот я бы _крайне_ не рекоменовал создавать инструменты для "условного" накатывания скриптов. Если разработчики, формирующие поставку, не знают доподлинно, есть такое поле в БД или нет, значит у них нет контроля за состоянием структуры БД, и они вообще не знают, "на что" накатывают скрипты. Состояние БД после такого наката будет полностью неопределено, а, например, тестирование на ней не будет иметь никакой ценности. Инструменты для условного наката будут только маскировать ошибки. Лучше пусть скрипт свалится, чем молча накатится неправильная поставка. PS Правды ради, успешность наката сама по себе тоже не гарантирует, что была соблюдена правильная очерёдность и полнота поставок, но зачем же усугублять возможные проблемы. Условные накаты DDL - это костыль (вредный, но неизбежный) для СУБД, у которых DDL выполняется вне общего транзакционного механизма (и не откатывается по ошибке rollback'ом). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 17:35
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
Доля правды в Ваших словах есть, однако решение выбираю не я. Это необходимо для нескольких СУБД, но вот с db2 уже третий день бьюсь )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 17:44
|
|||
|---|---|---|---|
Простой запрос без процедуры if/then/else |
|||
|
#18+
slitvin, Вероятней всего ошибка в том, как процессит команду сам RazorSQL. Выполните скрипт Command Line Processor'ом командами, указанными Марком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 18:19
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
slitvin, постарайтесь в этом RazorSQL в настройках найти, как изменить statement termination character (как-то так должно быть) с ; по-умолчанию на @. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 18:27
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 18:27
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
Но вот этот брыкается на 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 18:44
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
slitvin, В ATOMIC блоке нельзя делать PREPARE или EXECUTE. Если этот RazorSQL не умеет выполнять BEGIN ... END@ а может только BEGIN ATOMIC ... END@ то это именно его проблемы, а не db2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.08.2015, 19:18
|
|||
|---|---|---|---|
|
|||
Простой запрос без процедуры if/then/else |
|||
|
#18+
После долгих часов борьбы решение найдено. Слава Богу! 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=43&mobile=1&tid=1600755]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
79ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 280ms |
| total: | 445ms |

| 0 / 0 |
