![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IB Expert SQL Executive (как правильно написать скрипт?) [D7, FireBird 1.5]
КиТаЯц © (2005-10-20 12:42:00)Пишу:
set term ^;
begin
declare res integer;
begin
SELECT count(RDB$RELATION_NAME) FROM RDB$RELATIONS
WHERE (RDB$RELATION_NAME='TESTTABLE')
into res;
if (res = 0)
then
CREATE TABLE TESTTABLE (ID INTEGER);
end
end
^
set term ;^
/*Далее аналогично для следующей таблицы*/
Скрипт отрабатывать не хочет. IBExpert ругается чуть ли не на все строки. Идея такая: проверить есть ли в БД таблица (процедура etc.). Если нет - создать.
Базы локально (embeded) разных версий у разных пользователей. Сутуация будет (может) повторятся. Нужно для того, чтобы привести структуру БД к последней версии... и без всякого головняка - только выслав юзеру скриптовый файл.
Научите плиз криворукого как писать правильно. Спасибо.
Desdechado (2005-10-20 15:49:00) [1]изменений
255 на объект
потом backup-restore только помогает
Val (2005-10-20 15:44:00) [2]+[10] Desdechado © (20.10.05 15:21)
по крайней мере, в IB, был счетчик на кол-во пересозданий объекта метаданных.
Desdechado (2005-10-20 15:21:00) [3]плохо выполнять DDL в процедурах
см.[1]
КиТаЯц (2005-10-20 14:12:00) [4]
> Val © (20.10.05 13:57) [8]
Причина - НАДА. :)
Коротко не расскажеш. Хотя в эту сторону тоже подумаю. Если отказаться от проверок - то, теоретически, все должно получится.
> Desdechado © (20.10.05 13:51) [7]
Прошло "на ура" :) Почему это ПЛОХО? Чем грозит?
Val (2005-10-20 13:57:00) [5]>[6] КиТаЯц © (20.10.05 13:50)
можно привести причину суровой необходимости проверки в вашем случае?
Desdechado (2005-10-20 13:51:00) [6]я обычно делаю так (для всяких изврященных вариантов):
SET TERM ^ ;
CREATE PROCEDURE AAA
AS
BEGIN
IF( NOT EXISTS( SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE RDB$RELATION_NAME='AA' ) ) THEN
EXECUTE STATEMENT 'CREATE TABLE aa(ID INTEGER)';
END
^
SET TERM ; ^
EXECUTE PROCEDURE AAA;
DROP PROCEDURE AAA;
но это ПЛОХО
по стилю вижу, из Оракла попытки выполнения кодовых блоков - такого в IB нет
КиТаЯц (2005-10-20 13:50:00) [7]
> Val © (20.10.05 13:23) [3]
В моем случае проверка нужна. Никак без нее.
> Sergey13 © (20.10.05 13:33) [4]
Возможно. Суть в следующем. Делал так:
- динамически креачу IBQuery - запихиваю возвращаемое значение в переменную - IBQuery уничтожаю.
- проверяю переменную - версия старая - креачу IBQuery - выполняю запрос (напр. создание таблицы) - удаляю IBQuery
Все это в одной процедуре код которой растянулся на туеву хучу строк...
Буквально вчера (!!!) только узнал, что у IBX есть обновление. Установил. И... Обнаружил компонент IBScript.
Во, думаю, кайф! Щас экзешник состряпаю и буду только скрипты подгружать. Ага, размечтался. Сразу уперся в проблемму, что НЕ МОГУ (или не умеюили "в скриптах нет логики") на чистом SQL написать то, чего мне хочется...
Val (2005-10-20 13:49:00) [8]>Sergey13 © (20.10.05 13:33)
В скриптах вроде не может быть логики. Это просто последовательность СКЛ-запросов.
уточню - для данного сервера.
Sergey13 (2005-10-20 13:33:00) [9]2КиТаЯц © (20.10.05 12:42)
Ты по моему спутал скрипты и процедуры. В скриптах вроде не может быть логики. Это просто последовательность СКЛ-запросов.
Наверное стОит програмку для этого написать. В ней и анализируй все. Кроме того проверять просто наличие таблицы - это слишком топорно, ИМХО. Если там от нужного только название, то вряд ли что выйдет.
Val (2005-10-20 13:23:00) [10]Нужно для того, чтобы привести структуру БД к последней версии... и без всякого головняка - только выслав юзеру скриптовый файл.
зачем проверять? просто выполняйте создание таблиц в скрипте, если они уже есть, получите соотв. ошибку и таблицы не создадутся.
КиТаЯц (2005-10-20 13:02:00) [11]
> Zacho © (20.10.05 12:49) [1]
Спасибо. И все-таки как написать на SQL правильно следующий скрипт:
если количество селектов из из системной таблицы больше нуля, то создать таблицу #1;
если количество селектов из из системной таблицы больше нуля, то создать таблицу #2;
и .т.д...
Zacho (2005-10-20 12:49:00) [12]Смешивать DDL и DML операторы в одной транзакции крайне не рекомендуется. А в ХП и триггерах применять DDL вообще нельзя