Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема с SET TERM


Klaus B. ©   (2006-06-13 19:57:00) 

Добрый день!
Имею проблему с созданием хранимой процедуры
работаю с Delphi 5.0 и InterBase 7.1
выкидывается ошибка при прохождении строки
SET TERM ^;
все перепробовал
ничего не получается


Desdechado   (2006-06-14 20:22:00) [1]

3. изменения метеданных часто требуют переподключения к БД, бо они кэшируются при подключении


kaif   (2006-06-14 11:34:00) [2]

Кстати, в IBX 6.04 существует компонент IBScript.
Вот он, кажется, понимает SET TERM. Я не помню - я писал свой IBScript для этой цели.
Единственное, на что рекомендую обратить внимание, так это то, что:
1. Изменения метаданных должны производиться в отдельнойтранзакции от изменения данных.
2. Изменения метаданных как правило рекомендуется сразу подтверждать.


kaif   (2006-06-14 11:27:00) [3]

ibquery1.Close - лишнее.


kaif   (2006-06-14 11:25:00) [4]

1. IBQuery исполняет одновременно только одну SQL-команду.
2. Такой SQL-команды, как SET TERM, не существует.
3. Команду SET TERM вылавливает разборщик скрипта, например парсер программы IBConsole и им подобных.
4. Для того чтобы создать хранимую процедуру с помощью IBQuery достаточно вписать в его свойство SQL текст процедуры без всяких SET TERM и вызвать метод ExecSQL.
В тексте процедуры терминатором должен оставаться символ ';'.
В конце команды никаких термигнаторов нре нужно - IBSQL и так выполняет только одну команду и поэтому в терминаторе не нуждается.

То есть:
ibtransaction1.active := true;
ibquery1.Close;
ibquery1.SQL.Text :=
 'CREATE PROCEDURE PRICE(P_INC INTEGER)')#13+
 'AS BEGIN'+#13+
 '  PR_INC = 1 ;'+#13+ //#13 - возврат каретки для красоты
 '  SUSPEND ;'+#13+
 'END';
ibquery1.execSQL;
ibtransaction1.commit;

Однако для этих целей лучше использовать не IBQuery (это слишком избыточно), а IBSQL (компонент с минимальной функциональностью).
Все то же самое, только метод ExecQuery вместо ExecSQL.


Виталий Панасенко   (2006-06-14 09:22:00) [5]

И вообще-то, в 7 его уже нет. насколько я помню из просмотренной документации.


Desdechado   (2006-06-13 22:19:00) [6]

вообще-то SET TERM предназначен строго для скриптов и скриптогонялок
как раз для разделения команд
а в квери только по одной команде писатьнадо, без всяких термов
создание процедуры - тоже команда, тольдо длииииинная


Sergey Masloff   (2006-06-13 21:41:00) [7]

А с каких пор IbQuery по многу команд разрешает выполнять?


starling13   (2006-06-13 21:10:00) [8]

ibquery1.SQL.add('SET TERM ## ;');

ibquery1.SQL.add('CREATE PROCEDURE PRICE(P_INC INTEGER)');
ibquery1.SQL.add('AS BEGIN');
ibquery1.SQL.add('PR_INC =1;');
ibquery1.SQL.add('SUSPEND;');
ibquery1.SQL.add('END##');

ibquery1.SQL.add('SET TERM ; ##');


starling13   (2006-06-13 21:08:00) [9]


ibquery1.SQL.add('SET TERM ## ;');

ibquery1.SQL.add('CREATE PROCEDURE PRICE(P_INC INTEGER)');
ibquery1.SQL.add('AS BEGIN');
ibquery1.SQL.add('PR_INC := 1;');
ibquery1.SQL.add('SUSPEND;');
ibquery1.SQL.add('END##');

ibquery1.SQL.add('SET TERM ; ##');


Нет?


Klaus B.   (2006-06-13 20:20:00) [10]

Доподлино код выглядит так

ibtransaction1.active := true;
ibquery1.Close;
ibquery1.sql.Clear;
ibquery1.SQL.add('SET TERM ## ;');

ibquery1.SQL.add('CREATE PROCEDURE PRICE(P_INC INTEGER)');
ibquery1.SQL.add('AS BEGIN');
ibquery1.SQL.add('PR_INC := 1##');
ibquery1.SQL.add('SUSPEND##'); }
ibquery1.SQL.add('END##');

ibquery1.SQL.add('SET TERM ; ##');
ibquery1.execSQL;
ibtransaction1.commit;


Наверх

Титульная страница Поиск, карта сайта Написать письмо