![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с 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;