|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
18.11.2016, 12:19 | #1 |
Пользователь
Регистрация: 11.10.2008
Сообщений: 82
|
Выполнение скрипта через IBSQL
Добрый день! Я работаю с Oracle и в Delphi скрипты выполнения через OraSql. Тут понадобилось написать программулина в связки с Firebird, поэто работаю через компоненты Interbase. По аналогии взял IBSQL.
Запихал туда скрипт по аналогии с тем, как я делаю в Oracle (адаптировав по FB). execute block as declare lSurname varchar(99); declare lName varchar(99); declare pos integer; declare pp varchar(99); begin pp = 'Имя Фамилия'; --pp = :aName; pos = POSITION(' ', pp); lSurname = SUBSTRING(pp FROM 1 FOR pos-1); lName = SUBSTRING(pp FROM pos+1 FOR CHAR_LENGTH(pp)); insert into pupil(pupil_id,surname,name) values (GEN_ID(gen_pupil_id,1),:lSurname,: lName); end Если передаче в переменную pp строки напрямую, все выполняется без проблем. Но мне оно не надо, я в цикле подаю разные строки, т.е. мне нужен параметр. Для этого я комментирую строку pp = 'Имя Фамилия';, а следующую раскомментил. В коде пишу: IBSQL1.ParamByName('aName').AsStrin g := st; // в цикле переменная ST меняется IBSQL1.ExecQuery; При выполнении возникает ошибка Column unknown aName. Причем тут Column, я параметр хочу задать. Добавляю наверх declare aName varchar(99); и тут начинаются ошибки Field 'aName' not found Причем если я в IBSQL запихиваю простой запрос с Select, то с аналогичным способом передачи параметров проблем не возникает. Я ничего понять не могу. Как туда параметры правильно передавать? Знающие люди могут подсказать? Я уже подумал, что если не разберусь, то хранимую процедуру сделаю, с ней я точно разберусь. Но вот меня этот вопрос прям сильно заинтересовал. Последний раз редактировалось VHomer; 18.11.2016 в 12:29. |
18.11.2016, 14:10 | #2 |
Участник клуба
Регистрация: 23.04.2009
Сообщений: 1,058
|
ну любезный позвольте aName а где он тут
Код:
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
|
18.11.2016, 14:17 | #3 | |
Пользователь
Регистрация: 11.10.2008
Сообщений: 82
|
Цитата:
Я ж пишу : 'Для этого я комментирую строку pp = 'Имя Фамилия';, а следующую раскомментил.' Как раз pp = :aName раскомментировал и получилось execute block as declare lSurname varchar(99); declare lName varchar(99); declare pos integer; declare pp varchar(99); begin pp = :aName; pos = POSITION(' ', pp); lSurname = SUBSTRING(pp FROM 1 FOR pos-1); lName = SUBSTRING(pp FROM pos+1 FOR CHAR_LENGTH(pp)); insert into pupil(pupil_id,surname,name) values (GEN_ID(gen_pupil_id,1),:lSurname,: lName); end |
|
18.11.2016, 14:41 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А после записи скрипта в IBSQL.SQL проверить какие параметры компонент вообще опознал, в цикле for i:=0 to IBSQL.Params.Count-1
посмотреть на IBSQL.Params[i].Name или как там имя параметра называется. Я к тому, что параметры в датасетах обычно заточены под значения в VALUES, SET-ах, условиях во WHERE. А здесь еще возможно какой-то конфликт между способом задания параметров и синтаксисом скриптов огнептицы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
18.11.2016, 15:03 | #5 |
Пользователь
Регистрация: 11.10.2008
Сообщений: 82
|
IBSQL.Params.Count = 0. Ни одного параметра не нашлось.
|
18.11.2016, 15:10 | #6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Ну тогда либо процедуру, либо программно скрипт формировать без параметров. Либо еще вариант - что-то особенное есть в способе задания параметров для IBSQL, здесь не подскажу, не пользовался. Кстати с :lSurname выполнялось и как параметр не опознавалось. ADO бы опознал
ADD может предварительно ParseSQL выполнить?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 18.11.2016 в 15:14. |
18.11.2016, 15:18 | #7 |
Пользователь
Регистрация: 11.10.2008
Сообщений: 82
|
А я так понимаю, что это особенность FB при инсерте в блоке begin ... end. Я уже все что мне надо запихал в хранимую процедуру и там инсерт так же делал - ко всем переменным в values приписывал : впереди.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Остановить выполнение скрипта | max9123 | Общие вопросы Delphi | 2 | 02.11.2013 11:59 |
выполнение скрипта по крону | Mortimoro | PHP | 3 | 03.09.2012 15:30 |
Выполнение скрипта через 5 секунд | Arassir | PHP | 2 | 22.06.2011 21:40 |
Автоматическое выполнение скрипта | maksikus | PHP | 16 | 04.09.2010 06:13 |
Выполнение скрипта по расписанию | Sparky | PHP | 7 | 30.10.2009 16:33 |